Git: สิ่งที่ห้อยต่องแต่ง / หยดนั้นมาจากไหน?


149

ฉันกำลังมองหาข้อมูลพื้นฐานเกี่ยวกับ dangling commits & blobs

repo ของฉันดูดี แต่ฉันวิ่งgit fsckเป็นครั้งแรกเพื่อดูว่ามันทำอะไรและฉันมีรายการ 'ห้อยต่องแต่งที่ยาวเหยียด' และ 'ห้อยตุ่น' ที่เดียว

สิ่งเหล่านี้คืออะไร พวกเขามาจากไหน พวกเขาบ่งบอกถึงสิ่งผิดปกติ (ดีหรือไม่ดี) เกี่ยวกับสถานะของ repo ของฉันหรือไม่?

คำตอบ:


96

ในระหว่างการทำงานกับพื้นที่เก็บข้อมูล git ของคุณคุณอาจทำการสำรองข้อมูลจากการดำเนินการและทำการย้ายอื่น ๆ ที่ทำให้เกิด blobs ตัวกลางและแม้แต่บางสิ่งที่ git ทำเพื่อช่วยหลีกเลี่ยงการสูญเสียข้อมูล

ในที่สุด (ตามเงื่อนไขตามหน้าgit gc man ) มันจะทำการเก็บขยะและทำความสะอาดสิ่งเหล่านี้ คุณสามารถบังคับได้โดยเรียกกระบวนการเก็บรวบรวมขยะgit gcนอกจากนี้คุณยังสามารถบังคับให้มันโดยเรียกกระบวนการเก็บรวบรวมขยะ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้โปรดดูการบำรุงรักษาและกู้คืนข้อมูลบนไซต์ git-scm

การเรียกใช้ GC แบบแมนนวลโดยค่าเริ่มต้นจะใช้เวลา 2 สัปดาห์ก่อนรันไทม์ของคำสั่งนี้ของตาข่ายนิรภัย ในความเป็นจริงเราขอแนะนำให้เรียกใช้ GC เป็นครั้งคราวเพื่อช่วยให้แน่ใจว่ามีการใช้พื้นที่เก็บข้อมูล git ของคุณอย่างมีประสิทธิภาพ คุณควรเข้าใจในสิ่งที่มันทำก่อนที่จะทำลายสิ่งเหล่านั้นที่อาจมีความสำคัญต่อคุณ


10
ดังนั้นจึงเป็นธรรมที่จะบอกว่า 1) ถ้าฉันคิดว่ามีบางอย่างผิดปกติกับ repo ของฉันมันปลอดภัยที่จะลบสิ่งเหล่านี้ด้วยgit gcและ 2) ฉันไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้เลยเพราะบิตห้อยเหล่านี้เป็นเรื่องปกติและคอมไพล์แล้ว จัดการกับพวกเขา?
doub1ejack

7
นั่นจะเป็นการประเมินที่ยุติธรรม
vgoff

9
นอกจากนี้เมื่อใดก็ตามที่คุณ 'เพิ่มคอมไพล์' ไฟล์ แต่ไม่ยอมรับไฟล์เวอร์ชันที่ถูกต้องคุณก็จะมีหยดห้อย ไม่มีอะไรต้องกังวล
canton7

7
doub1ejack - โดยทั่วไปคุณไม่ควรเรียกใช้การรวบรวมขยะด้วยตนเอง มันเป็นนิสัยที่ไม่ดีที่จะเข้าไปและคอมไพล์ทำการเก็บขยะเมื่อจำเป็นอย่างไรก็ตาม ข้อเสียของการรันด้วยตนเองคือคุณสูญเสียความสามารถในการกู้คืนบล็อกห้อยและยอมรับว่าคุณอาจไม่ต้องการตอนนี้ แต่คุณอาจต้องการในอนาคต เมื่อคุณเรียกใช้คอลเลกชันขยะคุณจะลบการใช้งานบางอย่างที่มีประสิทธิภาพกลับคืนจากคอมไพล์ ใช้ด้วยความระมัดระวังและเป็นข้อยกเว้นไม่ใช่กฎ --- ปล่อยให้คอมไพล์ทำสิ่งนั้น
Elijah Lynn

97

Dangling blob = การเปลี่ยนแปลงที่เกิดขึ้นกับพื้นที่ / ดัชนี แต่ไม่ได้รับการยืนยัน สิ่งหนึ่งที่น่าทึ่งกับคอมไพล์ก็คือเมื่อมันถูกเพิ่มเข้าไปในพื้นที่จัดแสดงคุณสามารถรับมันกลับมาได้เพราะ Blobs เหล่านี้ทำตัวเหมือนกระทำในสิ่งที่พวกเขามีแฮชด้วยเช่นกัน !!

Dangling กระทำ = การกระทำที่ไม่ได้เชื่อมโยงโดยตรงกับการกระทำของเด็ก, สาขา, แท็กหรือการอ้างอิงอื่น ๆ คุณสามารถรับสิ่งเหล่านี้กลับมาได้เช่นกัน!


5
'บรรพบุรุษ' ควรอ่าน 'ลูกหลาน' หรือไม่? โดยทั่วไปคุณจะไม่สามารถเข้าถึงคอมไพล์ผ่านทางบรรพบุรุษได้
Phil Miller

@Novelocrat ฉันมีความคิดเหมือนกันฉันเห็นด้วยว่ามันน่าจะอ่านลูกหลาน
stkent

1
ฉันยังอ่าน "ลัคนา" ในคำตอบของคุณ ดูเหมือนว่าฉบับของคุณตั้งแต่วันที่ 2 กรกฎาคมไม่ได้แก้ไขคำที่พิมพ์ผิด
iclman

คุณจะได้รับหยดห้อยกลับได้อย่างไร?
HelloGoodbye

1
@ElijahLynn คุณพูดถูก ฉันคิดว่าฉันอ่านการอภิปรายเร็วเกินไป dangling commit ไม่ได้มีลูกหลาน / ลูกและไม่ได้อ้างอิงโดยแท็กหรือสาขา
iclman

44

HOWTO ลบการผูกมัดทั้งหมดออกจากที่เก็บ git ของคุณจาก http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

git reflog expire --expire=now --all
git gc --prune=now

ตรวจสอบให้แน่ใจว่าคุณต้องการลบพวกเขาจริงๆเพราะคุณอาจตัดสินใจว่าคุณต้องการพวกเขาหลังจากทั้งหมด


6
ในความเป็นจริงผู้ใช้ส่วนใหญ่ไม่ควรต้องการสิ่งนี้และหากพวกเขาทำมันอาจเป็นกรณีการใช้งานแบบเป็นโปรแกรม พื้นที่ดิสก์ที่บันทึกไว้หรือความเร็วเพิ่มขึ้นโดยการลบค่าคอมมิชชันนั้นไม่คุ้มค่ากับความพยายามในความคิดของฉัน
Elijah Lynn

1
คำตอบนี้เป็นคำถามที่แตกต่าง
Elijah Lynn

6

ห้อยกระทำเป็นกระทำที่ไม่เกี่ยวข้องกับการอ้างอิงคือไม่มีทางที่จะไปถึงมัน

ตัวอย่างเช่นพิจารณาแผนภาพด้านล่าง สมมติว่าเราลบ featureX ของสาขาโดยไม่รวมการเปลี่ยนแปลงจากนั้นคอมมิท D จะกลายเป็นคอมมิชชันห้อยเนื่องจากไม่มีการอ้างอิงที่เกี่ยวข้อง ถ้ามันถูกรวมเข้ากับมาสเตอร์แล้ว HEAD และการอ้างอิงหลักจะชี้ไปที่คอมมิท D และมันจะไม่ห้อยอีกต่อไปแม้ว่าเราจะลบฟีเจอร์ X อ่านหมายเหตุหลังจากแผนภาพเพื่อทำความเข้าใจกับสิ่งนี้ให้ดีขึ้น

Git จะทำการรวบรวมขยะโดยอัตโนมัติ เราสามารถใช้git reflogเพื่อกู้คืนสาขา (ของ dangling commits) ซึ่งถูกลบโดยไม่รวมเข้าด้วยกัน เราสามารถกู้คืนคอมมิทที่ถูกลบได้ก็ต่อเมื่อมีอยู่ในที่เก็บวัตถุในเครื่องเท่านั้น หากเป็นขยะที่เก็บรวบรวมเราจะไม่สามารถกู้คืนได้

ป้อนคำอธิบายรูปภาพที่นี่

บันทึกว่าชื่อสาขาเช่นป้ายสาขาจริงๆแล้วเป็นการอ้างอิงถึงการกระทำล่าสุดในสาขาเช่นปลายของสาขา ในแผนภาพด้านบน featureX, master และ HEAD เป็นเพียงการอ้างอิงถึงการกระทำที่เฉพาะเจาะจง featureX และป้ายกำกับหลักอ้างอิงถึงการกระทำล่าสุดในสาขาที่เกี่ยวข้อง โดยทั่วไปหัวหมายถึงส่วนปลายของสาขาที่เช็คเอาท์ในปัจจุบัน (ต้นแบบในกรณีนี้) หากคุณชำระเงินการกระทำที่เก่ากว่าในสาขาปัจจุบันของคุณ HEAD จะอยู่ในสถานะแยกออกนั่นคือมันจะชี้ไปที่การส่งมอบที่เก่ากว่าแทนที่จะเป็นการกระทำล่าสุด นอกจากนี้โปรดทราบว่า HEAD เรียกว่าการอ้างอิงแบบสัญลักษณ์เนื่องจากจริง ๆ แล้วชี้ไปที่ป้ายสาขาปัจจุบันและป้ายสาขาใด ๆ ชี้ไปที่ปลายของสาขาเสมอ ดังนั้นภายใต้สถานการณ์ปกติ HEAD จึงชี้ไปที่การกระทำล่าสุด

เช่นกันทราบว่า Git เป็นตัวแทนของตนกระทำกราฟ / ประวัติศาสตร์เป็นชี้นำวัฏจักรกราฟ การกระทำแต่ละครั้งมีการอ้างอิงถึงผู้ปกครอง ดังนั้นลูกศรในจุดไดอะแกรมคอมมิตจาก child commit ไปยัง parent commit เราต้องการการอ้างอิงถึงเด็กที่กระทำล่าสุดเพื่อที่จะไปให้ถึงความมุ่งมั่นที่เก่ากว่าในสาขา

PS - แผนภาพข้างต้นและความเข้าใจที่ได้รับจากหลักสูตรฟรีนี้ แม้ว่าหลักสูตรจะค่อนข้างเก่าความรู้ก็ยังคงเกี่ยวข้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.