ไฟล์ที่เสียหายใน Git


8

ฉันเพิ่งลบบางโฟลเดอร์ออกจากประวัติ repos git ของฉันโดยใช้คำสั่งต่อไปนี้:

git filter-branch --index-filter 'git rm -r --cached var' -- --all

น่าเสียดายที่ฉันไม่สามารถดึงอีกต่อไปจาก repos นี้นี่เป็นข้อผิดพลาดที่ฉันได้รับ:

git pull
remote: Counting objects: 3953, done.
remote: Compressing objects: 100% (2810/2810), done.
error: garbage at end of loose object '4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0'
fatal: object 4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 is corrupted
fatal: index-pack failed

คุณทำการเปลี่ยนแปลงระบบ linux ใด?
Andres Jaan Tack

ฉันกำลังใช้ windows ตอนนี้ฉันอยู่บน linux และใช้งานได้ดี
mnml

คำตอบ:


7

วิญญาณที่ใจดีบางคนเขียนสคริปต์เพื่อทำสิ่งนี้โดยอัตโนมัติ (และละเอียดยิ่งขึ้น) แต่กระบวนการในการกู้คืนคือ:

  1. ตรวจสอบไฟล์ที่รายงานขยะด้วย hexdump

    $ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

    คุณกำลังมองหาส่วนหนึ่งของไฟล์ที่มีค่าเป็นศูนย์ขนาดใหญ่ หากมีช่วงดังกล่าวหลายครั้งฉันโชคดี (N = 2) เมื่อพิจารณาเพียงชุดยักษ์ชุดแรกแม้ว่ามันจะรวมข้อมูลขนาดเล็กที่ไม่ใช่ศูนย์ก็ตาม นี่คือ "ขยะ" ที่คอมไพล์บ่นเกี่ยวกับ

    ...
    0000500 0532 0302 0000 0000 0000 0000 0000 0000    # <-- Beginning here...
    0000510 0000 0000 0000 0000 0000 0000 0000 0000
    *
    0001000             # ... almost 3kb of zeros.
    

    คุณสามารถกำหนดขนาดจริงของวัตถุได้ นี่คือ 0x504 หรือ 1,284 ไบต์

  2. ทำสำเนาสำรองของวัตถุ ในกรณีที่คุณเลือกเลขศูนย์ไม่ถูกต้องคุณสามารถลองอีกครั้งด้วยชุดอื่น

    $ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
  3. ตัดไฟล์ให้มีความยาวที่เหมาะสม

    $ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

วัตถุที่เสียหายควรได้รับการแก้ไขแล้ว สมมติว่าเป็นสิ่งเดียวการโคลน / การผลัก / การดึงที่เก็บควรจะทำงานได้ตามที่คาดไว้

การอ้างถึงแหล่งที่มาของฉันฉันเชื่อว่าฉันประสบปัญหาเดียวกัน แต่ในกรณีของฉันโดยใช้ Ubuntu 10.4 (เคอร์เนล 2.6.32-23-generic) ในกรณีนี้มันเป็นข้อผิดพลาดของระบบไฟล์ที่ยังไม่ถูกติดตาม มีปัญหาเกี่ยวกับการเปิดเป็นecryptfsในเรื่องนี้และยังเป็นด้าย Usenet ที่เกี่ยวข้อง ฉันพบคำตอบและบทสรุปที่สะดวกเกี่ยวกับ StackOverflow บทความเชื่อมโยงเป็นที่น่าสนใจมาก แต่ในที่สุดฉันไปเป็นวิธีที่แตกต่างกัน


ขอบคุณมากสำหรับคำตอบนี้ git-remove-trailing-garbage.py (ลิงก์ของคุณพร้อมข้อความ "เขียนสคริปต์" ด้านบน) บันทึกเบคอนของฉันเมื่อฉันพบปัญหาข้อผิดพลาด ecryptfs ที่คุณกล่าวถึง!
Adam Monsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.