คอมไพล์นายสาขาที่เสียหาย


9

ฉันเปิดที่เก็บ Git โดยใช้ gitExtensions บน Windows 7 สำหรับโครงการ Visual Studio มันว่างเปล่าทันที ที่เก็บมีอยู่ แต่การกระทำทั้งหมดของฉันได้หายไป

ฉันใช้อินเทอร์เฟซแบบกราฟิกและฉันเชื่อว่านี่เป็นครั้งแรกที่ฉันเปิดมันเนื่องจากพวกเขาอัปเดต

ฉันไม่แน่ใจว่าจะทำอย่างไรเกี่ยวกับการเรียกคืนความมุ่งมั่นของฉัน

เมื่อฉันพิมพ์

git log 

ฉันได้รับ

ร้ายแรง: การแก้ไขค่าเริ่มต้นที่ไม่ดี 'HEAD'

อัปเดต
หลังจากดูที่/programming/1545407/recovering-broken-git-repositoryฉันได้ลองแล้ว

gs fsck

มันกลับมา:

ข้อผิดพลาด: HEAD ไม่ถูกต้อง
ร้ายแรง: วัตถุที่ไม่ถูกต้อง36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (เก็บไว้ใน. git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671cceb864c0b9cc86fcdaf86dc

การส่งคืนผลตอบแทน:

ข้อผิดพลาด: ไม่สามารถแก้ไขการอ้างอิง HEAD: ไม่มีไฟล์หรือไดเรกทอรีที่
ร้ายแรงดังกล่าว: ไม่สามารถล็อกการอ้างอิง HEAD ได้

และสาขาการบันทึกหลักส่งคืน

$ git log master เตือน: ละเว้นการอ้างอิง refs / heads / master ที่เสียหาย คำเตือน: ละเว้นการอ้างอิง refs / heads / master ที่เสียหาย ร้ายแรง: อาร์กิวเมนต์ที่กำกวม 'master': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่ได้อยู่ในแผนผังการทำงาน ใช้ '-' เพื่อแยกเส้นทางจากการแก้ไข

ป่วยเพียงแค่วางสิ่งที่อาจเกี่ยวข้อง

$ git reflog master
warning: ละเว้น refs / heads / master ที่หัก
คำเตือน: ละเว้นการอ้างอิง refs / heads / master ที่เสียหาย
ร้ายแรง: อาร์กิวเมนต์ที่กำกวม 'master': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่ได้อยู่ในแผนผังการทำงาน
ใช้ '-' เพื่อแยกเส้นทางจากการแก้ไข

ข้อมูลที่เป็นประโยชน์มากขึ้น: ทุกครั้งที่ฉันลบไฟล์ที่เสียหาย ฉันเริ่มที่จะคิดว่ามันเกี่ยวข้องกับสาขาหลักที่ชี้ไปยังสิ่งที่ผิดหรือบางสิ่งบางอย่าง เพราะฉันถือว่าหัวกำลังชี้ไปที่นาย

หนึ่งวันต่อมา:
ดังนั้นฉันได้เพื่อนของฉันมาที่นี่เขาสามารถผ่านบันทึกและเขาบอกว่าแฮชในบันทึกไม่ตรงกับวัตถุในโฟลเดอร์ เขาลองรีเซ็ตสาขาหลักเป็นบันทึกหรืออะไรทำนองนั้นฉันหลงทางนิดหน่อย หวังว่าจะเป็นประโยชน์


ที่เกี่ยวข้องในดังนั้น: stackoverflow.com/questions/6214711/... stackoverflow.com/questions/1545407/...
heavyd

1
@heavyd โปรดตรวจสอบการอัปเดต
MrJD

คำตอบ:


3

ที่เก็บมีอยู่ แต่การกระทำทั้งหมดของฉันได้หายไป

คุณหมายถึงอะไรกันแน่? ต้นไม้ทำงานยังอยู่ที่นั่นไหม? ไม่.git/อยู่? มีไฟล์ใดบ้างในนั้น

ข้อความที่คุณโพสต์แนะนำว่าไฟล์.git/HEADไม่มีอยู่ มันจะกำหนดสถานะที่คาดหวังของแผนผังการทำงาน (สิ่งที่คุณได้เช็คเอาท์) หากไฟล์นั้นหายไป git จะไม่รู้ว่าคุณอยู่ที่ไหน

คุณสามารถลองสร้างไฟล์ด้วยตัวเองด้วยเนื้อหานี้: ref: refs/heads/master

หากคุณอยู่ในสาขาอื่นให้แทนที่ "master" ด้วยชื่อสาขา หากคุณไม่ได้อยู่ในสาขามันจะซับซ้อนกว่านี้

.git/logs/HEADบันทึกสถานะที่ผ่านมาของ HEAD ด้วยบรรทัดต่อมาที่ด้านล่าง บรรทัดตัวอย่างนี้แสดงการชำระเงิน: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

ด้านหน้า SHA1 อ้างถึงการกระทำ .git/logs/refs/heads/masterคุณควรจะสามารถที่จะหาเหล่านี้ในบันทึกของสาขาเช่น

เอาต์พุต reflog git ที่คุณให้ดูเหมือนrefs/heads/masterจะหายไปเช่นกัน เนื้อหาของมันควรจะเป็น SHA1 ของการคอมมิทล่าสุด (และการขึ้นบรรทัดใหม่) คุณสามารถค้นหา SHA1 .git/logs/refs/heads/masterล่าสุดในตอนท้ายของบันทึกสาขาเช่น


2

หาก. git / HEAD มีอยู่แล้วและเนื้อหาref: refs/heads/masterนั้นตรวจสอบไฟล์ refs / heads / master จะต้องมี sha1 ของการส่งครั้งล่าสุด

หากไฟล์นั้นเสียหายและเต็มไปด้วยอักขระ NULL แก้ไขไฟล์นั้นและวาง sha1 ของการคอมมิทล่าสุด.git/logs/HEADหรือก่อนคอมมิทครั้งล่าสุด

จากนั้นทำ git reset --hard 'sha1 of the commit that you selected'


มันเต็มไปด้วยตัวอักษร NULL ดังนั้นฉันจึงใส่ sha1 ของการคอมมิชชันก่อนหน้า แต่จากนั้นทำการ git reset ส่งผลให้เกิด "ข้อผิดพลาด: update_ref ล้มเหลวสำหรับการอ้างอิง 'HEAD': ไม่สามารถล็อก ref 'HEAD': ไม่สามารถแก้ไขการอ้างอิง HEAD: อาร์กิวเมนต์ไม่ถูกต้อง "
1717

1

ดูเหมือนว่าธุรกรรมซื้อคืนของคุณได้รับความเสียหาย สิ่งที่ง่ายที่สุดที่จะทำคือกู้คืน repo ของคุณจากข้อมูลสำรองหรือคัดลอก repo ซ้ำจากแหล่งที่มาเดิม (สมมติว่าคุณไม่มีงานจำนวนมากใน repo)

หากการรีโหลด / การโคลนไม่ใช่ตัวเลือกฉันขอแนะนำให้อ่านผ่านPro Git (หนังสือออนไลน์หรือรุ่นกระดาษฟรี ) หนังสือทั้งเล่มมีข้อมูลมากโดยเฉพาะอย่างยิ่งดูบทสุดท้ายเพื่อทำความเข้าใจว่า Git ทำงานอย่างไรภายใน เมื่อคุณมีความเข้าใจในวิธีการทำงานของ Git ให้ดูที่ไลนัส a คำแนะนำเกี่ยวกับการกู้คืนวัตถุเสียหาย


ดังนั้นน่าเศร้าที่ฉันไม่ได้สำรองไฟล์ที่ซ่อนอยู่. git ถูกซ่อนอยู่ ฉันไม่มีเวลาพอที่จะอ่านหนังสือทั้งเล่มมีอะไรที่คุณคิดว่าฉันจะลองได้บ้าง
MrJD

"อ่านหนังสือเกี่ยวกับ internals" อาจเป็นคำแนะนำทั่วไปที่ฟังดูดี แต่มันก็ไม่ได้ช่วยแก้ปัญหาและคำถามเฉพาะอย่าง
Burhan Ali

0

หลังจากท่องเว็บสักพักหนึ่งในที่สุดฉันก็พบสิ่งนี้และมันใช้งานได้

git fetch origin
git reset --hard origin/master

ที่ได้รับการเปลี่ยนแปลงใด ๆ จากorigin(หวังว่าจะไม่ทำงานมากเกินไปในพื้นที่) จากนั้นบังคับให้masterสาขาท้องถิ่นเห็นด้วยกับรีโมท ระวัง--resetวิธีการยกเลิกการใด ๆการเปลี่ยนแปลงในท้องถิ่น! นอกจากนี้หากมันไม่ได้หักเกินไปก็git reset origin/masterจะได้รับการคืนค่าล่าสุด (เช็คอิน) สถานะของmasterสาขา
vonbrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.