คุณควรจะสามารถกู้คืนไฟล์ใด ๆ ที่คุณเพิ่มลงในดัชนี (เช่นในสถานการณ์ของคุณด้วยgit add .
) แม้ว่ามันอาจจะใช้งานได้เล็กน้อย ในการเพิ่มไฟล์ลงในดัชนี git จะเพิ่มไฟล์ลงในฐานข้อมูลออบเจ็กต์ซึ่งหมายความว่าสามารถกู้คืนได้ตราบเท่าที่การรวบรวมขยะยังไม่เกิดขึ้น มีตัวอย่างวิธีการทำในคำตอบของ Jakub Narębskiที่นี่:
อย่างไรก็ตามฉันลองใช้ที่เก็บทดสอบแล้วและมีปัญหาสองสามอย่าง - --cached
ควรจะเป็น--cache
และฉันพบว่ามันไม่ได้สร้าง.git/lost-found
ไดเร็กทอรีจริง อย่างไรก็ตามขั้นตอนต่อไปนี้ใช้ได้ผลสำหรับฉัน:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
สิ่งนี้ควรส่งออกอ็อบเจ็กต์ทั้งหมดในฐานข้อมูลอ็อบเจ็กต์ที่ไม่สามารถเข้าถึงได้โดย ref ใด ๆ ในดัชนีหรือผ่าน reflog ผลลัพธ์จะมีลักษณะดังนี้:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... และสำหรับแต่ละกลุ่มคุณสามารถทำได้:
git show 907b308
เพื่อส่งออกเนื้อหาของไฟล์
ผลผลิตมากเกินไป?
อัปเดตเพื่อตอบสนองต่อความคิดเห็นของseheด้านล่าง:
หากคุณพบว่าคุณมีคอมมิตและทรีจำนวนมากที่แสดงรายการในเอาต์พุตจากคำสั่งนั้นคุณอาจต้องการลบอ็อบเจ็กต์ใด ๆ ที่อ้างอิงจากคอมมิตที่ไม่ได้อ้างถึงออกจากเอาต์พุต (โดยปกติคุณสามารถกลับไปที่การกระทำเหล่านี้ผ่าน reflog ได้อยู่ดี - เราสนใจแค่ออบเจ็กต์ที่ถูกเพิ่มลงในดัชนี แต่ไม่สามารถพบได้ผ่านการคอมมิต)
ขั้นแรกให้บันทึกผลลัพธ์ของคำสั่งด้วย:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
ตอนนี้ชื่อวัตถุของการกระทำที่ไม่สามารถเข้าถึงได้เหล่านั้นสามารถพบได้ด้วย:
egrep commit all | cut -d ' ' -f 3
ดังนั้นคุณสามารถค้นหาเฉพาะต้นไม้และวัตถุที่ถูกเพิ่มลงในดัชนี แต่ไม่ได้รับการยืนยัน ณ จุดใด ๆ ด้วย:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
สิ่งนี้ช่วยลดจำนวนวัตถุที่คุณต้องพิจารณาลงอย่างมาก
ปรับปรุง: ฟิลิป Oakleyด้านล่างแสดงให้เห็นวิธีการตัดลงจำนวนของวัตถุที่จะต้องพิจารณาซึ่งเป็นเพียงการพิจารณาไฟล์ส่วนใหญ่เมื่อเร็ว ๆ .git/objects
นี้ภายใต้การปรับเปลี่ยนอีก คุณสามารถค้นหาสิ่งเหล่านี้ได้ด้วย:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(ฉันพบfind
คำเรียกร้องนั้นที่นี่ ) ส่วนท้ายของรายการนั้นอาจมีลักษณะดังนี้:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
ในกรณีนี้คุณสามารถดูวัตถุเหล่านั้นด้วย:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
(โปรดทราบว่าคุณต้องลบ/
ในตอนท้ายของเส้นทางเพื่อรับชื่อวัตถุ)