ฉันเพิ่งพบสิ่งนี้ - เครื่องของฉันพังขณะที่เขียนถึง Git repo และมันก็เสียหาย ฉันแก้ไขมันดังนี้
ฉันเริ่มต้นด้วยการดูว่ามีกี่คอมมิชชันที่ฉันไม่ได้ผลักไปที่ repo ระยะไกลดังนั้น:
gitk &
หากคุณไม่ได้ใช้เครื่องมือนี้มันมีประโยชน์มาก - มีให้ในทุกระบบปฏิบัติการเท่าที่ฉันรู้ สิ่งนี้บ่งชี้ว่ารีโมตของฉันหายไปสองคอมมิต ฉันจึงคลิกที่ป้ายกำกับเพื่อระบุการกระทำระยะไกลล่าสุด (โดยปกติจะเป็น/remotes/origin/master
) เพื่อรับแฮช (แฮชมีความยาว 40 ตัวอักษร แต่สำหรับช่วงสั้น ๆ ที่ฉันใช้ 10 ที่นี่ - มันใช้งานได้อยู่ดี)
นี่มันคือ:
14c0fcc9b3
จากนั้นฉันคลิกที่คอมมิชชันต่อไปนี้ (เช่นอันแรกที่รีโมตไม่มี) และรับแฮชที่นั่น:
04d44c3298
จากนั้นฉันจะใช้ทั้งสองอย่างนี้เพื่อทำปะแก้สำหรับการคอมมิท
git diff 14c0fcc9b3 04d44c3298 > 1.patch
จากนั้นฉันก็ทำเช่นเดียวกันกับคอมมิชชันอื่นที่หายไปนั่นคือฉันใช้แฮชของคอมมิชชันมาก่อนและแฮชของคอมมิทเอง:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
ฉันย้ายไปยังไดเรกทอรีใหม่โคลน repo จากระยะไกล:
git clone git@github.com:username/repo.git
จากนั้นฉันก็ย้ายไฟล์แพตช์ไปยังโฟลเดอร์ใหม่และนำไปใช้กับพวกเขาและยืนยันพวกเขาด้วยข้อความยืนยันที่แน่นอนของพวกเขา (สิ่งเหล่านี้สามารถวางจากgit log
หรือgitk
หน้าต่าง):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
สิ่งที่ได้รับการคืนค่าสำหรับฉัน (และโปรดทราบว่าอาจเป็นวิธีที่เร็วกว่าสำหรับการทำสัญญาจำนวนมาก) อย่างไรก็ตามฉันกระตือรือร้นที่จะดูว่าต้นไม้ใน repo ที่เสียหายสามารถซ่อมแซมได้หรือไม่และคำตอบก็คือ ด้วย repo ที่ซ่อมแซมแล้วพร้อมใช้งานตามข้างต้นให้รันคำสั่งนี้ในโฟลเดอร์ที่เสียหาย:
git fsck
คุณจะได้รับสิ่งนี้:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
เพื่อทำการซ่อมแซมฉันจะทำสิ่งนี้ในโฟลเดอร์ที่เสียหาย:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
เช่นลบไฟล์ที่เสียหายและแทนที่ด้วยไฟล์ที่ดี คุณอาจต้องทำหลายครั้ง ในที่สุดจะมีจุดที่คุณสามารถเรียกใช้fsck
โดยไม่มีข้อผิดพลาด คุณอาจจะมีบรรทัด "dangling commit" และ "dangling blob" ในรายงานเหล่านี้เป็นผลมาจากการคืนเงินของคุณและแก้ไขในโฟลเดอร์นี้และตกลง ตัวรวบรวมขยะจะลบออกในเวลาอันควร
ดังนั้น (อย่างน้อยในกรณีของฉัน) ต้นไม้ที่เสียหายไม่ได้หมายความว่าความมุ่งมั่นที่ไม่ได้ชำระจะหายไป