Git:“ วัตถุหลวมเสียหาย”


329

เมื่อใดก็ตามที่ฉันดึงจากระยะไกลฉันได้รับข้อผิดพลาดต่อไปนี้เกี่ยวกับการบีบอัด เมื่อฉันเรียกใช้การบีบอัดด้วยตนเองฉันจะได้รับเหมือนกัน:

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

ไม่มีใครรู้ว่าจะทำอย่างไรเกี่ยวกับที่?

จากไฟล์ cat ฉันได้รับสิ่งนี้:

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

และจาก git fsck ฉันได้รับสิ่งนี้ (ไม่ทราบว่าเกี่ยวข้องกันจริงหรือไม่):

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

ทุกคนสามารถช่วยฉันถอดรหัสสิ่งนี้ได้หรือไม่?


คุณลองดูที่วัตถุหลัง (45ba4ceb93bc812ef20a6630bb27e9e0b33a012a) หรือไม่?
Gintautas Miliauskas

4
ขอบคุณ ... แต่ใครจะ "ดู" วัตถุได้อย่างไร ยังใหม่กับคอมไพล์ :)
asgerhallas

2
´git show´ ไม่ได้ให้อะไรมากไปกว่า´git fsck´ ที่ได้ทำไปแล้ว
asgerhallas

4
Linus Torvalds เขียนเอกสารที่มีประโยชน์ต่อไปนี้เกี่ยวกับข้อผิดพลาดนี้และวิธีการสร้าง blobs ใหม่ด้วยตนเองหากคุณมีไฟล์: วิธีการกู้คืนวัตถุ blob ที่เสียหายเทคนิคบางอย่างในการสร้างวัตถุ blob ใหม่เพื่อแก้ไขพื้นที่เก็บข้อมูลที่เสียหาย
Uwe Kleine-König

2
คุณสามารถเพิ่มความคิดเห็นหรือแก้ไขคำตอบที่ยอมรับได้ไหม? ฉันอยู่ในสถานการณ์เดียวกันและคำตอบที่ยอมรับนั้นดูเหมือนจะไม่มีรายละเอียดเพียงพอสำหรับ "Just Work TM" แต่จะบังคับให้ฉันดำดิ่งลงไปในรายละเอียดแทนตัวเอง
ripper234

คำตอบ:


57

ดูเหมือนว่าคุณมีวัตถุต้นไม้ที่เสียหาย คุณจะต้องรับวัตถุนั้นจากคนอื่น หวังว่าพวกเขาจะมีเวอร์ชั่นที่ไม่เสียหาย

คุณสามารถสร้างมันขึ้นมาใหม่ได้จริงถ้าคุณไม่สามารถหารุ่นที่ถูกต้องจากคนอื่นโดยการเดาว่าไฟล์ใดควรอยู่ที่นั่น คุณอาจต้องการดูว่าวันที่ & เวลาของวัตถุนั้นตรงกันหรือไม่ เหล่านั้นอาจเป็น blobs ที่เกี่ยวข้อง คุณสามารถอนุมานโครงสร้างของวัตถุต้นไม้จากวัตถุเหล่านั้น

ดูGit Screencasts ของ Scott Chacon ที่เกี่ยวกับ git internals นี่จะแสดงให้คุณเห็นว่าระบบคอมพิวเตอร์ทำงานอย่างไรภายใต้ประทุนและจะทำงานเกี่ยวกับนักสืบได้อย่างไรหากคุณติดอยู่จริงๆและไม่สามารถเอาวัตถุนั้นมาจากคนอื่นได้


2
มันอาจถูกเก็บไว้ในไฟล์แพ็ค นี่คือวิธีการคอมไพล์บีบอัดที่เก็บวัตถุโดยการจัดเก็บเดลต้า วัตถุที่หลวมเป็นวัตถุที่ไม่ได้อยู่ในแพ็คเกจ Google สำหรับไฟล์ชุดไฟล์ดัชนีในคอมไพล์และคุณควรจะดำดิ่งลึกเท่าที่คุณต้องการ
Adam Dymitruk

2
คุณสามารถให้ลิงค์ในคำตอบของคุณที่มีต่อ screencasts Git ของ Chacon ได้หรือไม่?
Ehtesh Choudhury

1
git cat-file -t <SHA1>จะบอกประเภทให้คุณทราบ หากไม่เสียหายคุณสามารถทำgit cat-file <type> <SHA1>เพื่อดูเนื้อหา (ฉันใช้สำหรับ a blobฉันเดาว่ามันจะแสดงเนื้อหาประเภทอื่น ๆ ให้คุณเห็น)
Carl G

1
นอกจากนี้ยังโพสต์นี้จาก Linus blobอธิบายขั้นตอนสำหรับการกู้คืน เมื่อฉันทำตามคำแนะนำเหล่านี้แม้ว่าgit statusตอบสนองfatal: unable to read <SHA1>แม้ว่าฉันจะประสบความสำเร็จในการทำงานgit hash-object -w <file>(อาจเป็นเพราะตามคำแนะนำของเขาฉันได้ย้ายไฟล์ออบเจ็กต์นั้นออกไปแล้วการส่งคืนมันก็ทำให้ฉันมีcorrupt loose objectข้อผิดพลาดเหมือนกัน)
Carl G

2
และตอนนี้กรุณาพูดเป็นภาษาอังกฤษซ้ำอีกครั้ง
Mehdi

359

ฉันมีปัญหาเดียวกัน (ไม่รู้สาเหตุ)

การแก้ไขนี้ต้องการการเข้าถึงสำเนาระยะไกลที่ไม่มีการขัดจังหวะของที่เก็บและจะทำให้สำเนาการทำงานภายในเครื่องของคุณไม่เสียหาย

แต่มันมีข้อเสีย:

  • คุณจะสูญเสียบันทึกการกระทำใด ๆ ที่ไม่ได้ถูกผลักและจะต้องแนะนำพวกเขา
  • คุณจะสูญเสียการหยุดทำงานใด ๆ

การแก้ไข

ดำเนินการคำสั่งเหล่านี้จากไดเรกทอรีหลักด้านบน repo ของคุณ (แทนที่ 'foo' ด้วยชื่อของโฟลเดอร์โครงการของคุณ):

  1. สร้างการสำรองข้อมูลของไดเรกทอรีที่เสียหาย:
    cp -R foo foo-backup
  2. สร้างโคลนใหม่ของที่เก็บระยะไกลไปยังไดเรกทอรีใหม่:
    git clone git@www.mydomain.de:foo foo-newclone
  3. ลบไดเรกทอรีย่อย. git ที่เสียหาย:
    rm -rf foo/.git
  4. ย้ายไดเรกทอรีย่อย. git ที่เพิ่งโคลนไปยัง foo:
    mv foo-newclone/.git foo
  5. ลบโคลนใหม่ที่เหลือชั่วคราว:
    rm -rf foo-newclone

บน Windows คุณจะต้องใช้:

  • copy แทน cp -R
  • rmdir /S แทน rm -rf
  • move แทน mv

ตอนนี้ foo มี.gitไดเรกทอรีย่อยดั้งเดิมอยู่แต่การเปลี่ยนแปลงในเครื่องทั้งหมดยังคงอยู่ git status, commit, pull, pushฯลฯ ทำงานอีกครั้งเท่าที่ควร


11
วิธีนี้ใช้ได้ผลสำหรับฉัน อย่างไรก็ตามฉันเชื่อว่าคำสัญญาที่ไม่ได้ชำระเงินทั้งหมดได้สูญหายไป ข้อมูล Repo ไม่ถูกแตะต้อง
เกี๊ยวตัน

30
ใช่ข้อมูลการยืนยันที่ไม่ได้ชำระจะหายไป แต่ในสถานการณ์ทั่วไป (ไม่มีสาขาในท้องที่ที่มีการเปลี่ยนแปลงที่ไม่ได้กดในสาขาอื่น ๆ มากกว่าปัจจุบัน) การแก้ไขไฟล์ล่าสุดทั้งหมด (การลบด้วยหมึก) ยังคงอยู่ในแผ่นดิสก์ดังนั้นจึงสามารถทำซ้ำได้อย่างง่ายดาย เนื่องจากฉันมักจะผลักดันหลังจากทำตามลำดับใด ๆ ฉันก็ไม่ได้เจอปัญหานี้
ผักกาดหอมลูกบาศก์

7
เรียบง่ายและตรงไปตรงมา นี่คือ IMO โซลูชั่นที่มีประสิทธิภาพมากที่สุดถ้าคุณไม่เข้าใจทุกอย่างเกี่ยวกับ git และคุณไม่ต้องการที่จะเล่นซอกับ repository ของคุณ
Oliboy50

4
ฉันคิดว่าจะลบการหยุดทั้งหมดเนื่องจากเก็บไว้ภายใต้ไดเรกทอรีย่อย. git
Anthony Elliott

4
ในกรณีที่มี submodules ในโครงการจำเป็นต้องเริ่มต้นก่อนเรียก.gitโฟลเดอร์
AdrieanKhisbe

242

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

ก่อนอื่นให้ทำสำเนาสำรองของไฟล์ในเครื่องของคุณ จากนั้นทำสิ่งนี้จากรูทของต้นไม้ทำงานของคุณ:

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master  

จากนั้นส่งไฟล์ที่เปลี่ยนแปลงตามที่จำเป็น


12
IMHO นี่ควรเป็นคำตอบที่ยอมรับได้ ง่ายกว่าการลบ repo และการโคลนซ้ำอีกครั้ง! :) แม้ว่าคุณจะทำสูญเสียใด ๆ ฉากกระทำ ...
นิค

6
เห็นได้ชัดว่าถ้าคุณอยู่ในสาขาอื่นที่ไม่ใช่เจ้านายเมื่อความเสียหายเกิดขึ้นให้แทนที่masterด้วยชื่อสาขาของคุณ
Timothy Zorn

ส่วนใหญ่ทำงานตามที่เป็นอยู่ แต่ฉันอยู่ในสาขาอื่นworkingเมื่อเกิดความเสียหายและขั้นตอนเหล่านี้ไม่ได้ให้สำเนาของสาขาอื่น ๆ ที่ไม่ใช่ต้นแบบ (และใช่ฉันพยายามแทนที่ต้นแบบด้านบนด้วยworkingแต่ไม่ได้ผล) จบลงด้วยการทำตามขั้นตอนข้างต้นmasterแล้วหยุดการเปลี่ยนแปลงของฉันและทำcheckout -b working origin/workingและหยุดที่นั่น ดูเหมือนว่าจะได้ทำงาน - ขอบคุณ!
เพ้อฝัน

1
ที่เก็บของฉันมี submodule ที่ไม่เสียหาย กระบวนการนี้เหลือพื้นที่เก็บข้อมูลและ submodule ในรัฐที่คำสั่งดังกล่าวเป็นผลgit status fatal: Not a git repository: submodules/my-sub/../../.git/modules/my-subการลบ submodule จากระบบไฟล์และรีสตาร์ทกระบวนการกู้คืนปกติ อาจทำให้แน่ใจว่าไม่มีชุดการเปลี่ยนแปลงที่ไม่ถูกผลักดันใน submodules ก่อนเป็นความคิดที่ดี ...
Steven Baldasty

5
ฉันทำสิ่งนี้ในวันนี้และจะไม่สูญเสียการเปลี่ยนแปลงใด ๆ กับไฟล์ :) (git 2.17.1)
Fábio Dias

173

การทำงานกับ VM ในโน้ตบุ๊กแบตเตอรี่หมดข้อผิดพลาดนี้

ข้อผิดพลาด: อ็อบเจ็กต์ไฟล์. git / objects / ce / theRef ว่างเปล่าข้อผิดพลาด: ไฟล์อ็อบเจ็กต์. git / objects / ce / theRef ว่างเปล่าร้ายแรง: อ็อบเจ็กต์หลวม theRef (เก็บไว้ใน. git / objects / ce / theRef) เสียหาย

ฉันจัดการเพื่อให้ repo ทำงานได้อีกครั้งด้วยคำสั่งเพียง 2 คำสั่งและไม่สูญเสียงานของฉัน (ไฟล์ที่แก้ไข / การเปลี่ยนแปลงที่ไม่ผูกมัด)

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin

หลังจากนั้นฉันก็วิ่งไปgit status, repo นั้นใช้ได้และมีการเปลี่ยนแปลงของฉัน (รอที่จะได้รับการยอมรับ, ทำมันตอนนี้ .. )

git เวอร์ชั่น 1.9.1

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


10
find .git/objects/ -size 0 -exec rm -f {} \;เหมาะกับฉัน;)
Lazaro Fernandes Lima Suleiman

มีปัญหาเดียวกันรันคำสั่งทำงานอย่างสมบูรณ์แบบสำหรับฉันบน Mint VM
Ludvig Rydahl

ทำงานได้อย่างสมบูรณ์แบบโดยไม่ต้องทำอะไรเลย
Halsafar

1
ไม่ได้อยู่บน VM และนี่ใช้งานได้กับฉันหลายครั้ง IDK เหตุใดสิ่งนี้จึงเกิดขึ้นในโครงการปัจจุบันของฉัน แต่สิ่งนี้จะแก้ไขได้ทุกครั้ง
James L.

7
คุณอาจจำเป็นต้องเรียกใช้git symbolic-ref HEAD refs/heads/master.หลังจากการลบวัตถุที่ว่างเปล่า
เตฟาน

43

คอมพิวเตอร์ของฉันล้มเหลวขณะที่ฉันเขียนข้อความยืนยัน หลังจากรีบูตเครื่องต้นไม้ทำงานก็เหมือนที่ฉันทิ้งไว้และฉันสามารถยอมรับการเปลี่ยนแปลงได้สำเร็จ

อย่างไรก็ตามเมื่อฉันพยายามที่จะเรียกใช้git statusฉันได้รับ

error: object file .git/objects/xx/12345 is empty
fatal: loose object xx12345 (stored in .git/objects/xx/12345 is corrupt

ซึ่งแตกต่างจากส่วนใหญ่ของคำตอบอื่น ๆ ผมไม่ได้พยายามที่จะกู้คืนข้อมูลใด ฉันแค่ต้องการให้ Git หยุดบ่นเกี่ยวกับไฟล์วัตถุที่ว่างเปล่า

ภาพรวม

"ไฟล์วัตถุ" เป็นการแฮชของไฟล์จริงที่คุณสนใจ Git คิดว่ามันควรจะsome/file.whateverเก็บไว้ในเวอร์ชั่นที่ถูกแฮ็.git/object/xx/12345กและการแก้ไขข้อผิดพลาดนั้นส่วนใหญ่จะเป็นเรื่องของการหาว่าไฟล์ใดที่ "หลวมวัตถุ" ควรจะเป็นตัวแทน

รายละเอียด

ตัวเลือกที่เป็นไปได้ดูเหมือนจะเป็น

  1. ลบไฟล์เปล่า
  2. รับไฟล์เข้าสู่สถานะที่ยอมรับโดย Git

วิธีที่ 1: ลบไฟล์วัตถุ

สิ่งแรกที่ฉันลองคือการย้ายไฟล์วัตถุ

mv .git/objects/xx/12345 ..

นั่นไม่ได้ผล - คอมไพล์เริ่มบ่นเกี่ยวกับลิงค์ที่เสียหาย ไปยังแนวทางที่ 2

วิธีที่ 2: แก้ไขไฟล์

Linus Torvalds มีการเขียนที่ยอดเยี่ยมของวิธีการกู้คืนอ็อบเจ็กต์ไฟล์ที่แก้ไขปัญหาให้ฉัน สรุปขั้นตอนสำคัญได้ที่นี่

$> # Find out which file the blob object refers to
$> git fsck
broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
           to    blob xx12345
missing blob xx12345

$> git ls-tree 2d926
...
10064 blob xx12345  your_file.whatever

สิ่งนี้บอกคุณว่าไฟล์ใดวัตถุเปล่าควรจะเป็นแฮชของ ตอนนี้คุณสามารถซ่อมได้

$> git hash-object -w path/to/your_file.whatever

หลังจากทำสิ่งนี้ฉันได้ตรวจสอบ.git/objects/xx/12345แล้วมันไม่ว่างเปล่าอีกต่อไปและคอมไพล์ก็หยุดบ่น


ฉันอยู่ในสถานการณ์ที่ฉันไม่มีรีโมตหรือสำรองข้อมูล repo ของฉันและมีการเพิ่มวัตถุที่เสียหายใกล้การกระทำครั้งแรกซึ่งอาจทำให้ต้นไม้ทั้งหมดเสียหาย ฉันมีวิธีของตัวเองพยายามที่จะสร้างวัตถุใน repo ที่แตกต่างกัน แต่คำตอบนี้บรรลุผลลัพธ์เดียวกันกับลูกเล่นมากขึ้น
Estecka

13

ลอง

git stash

สิ่งนี้ใช้ได้สำหรับฉัน มันหยุดสิ่งที่คุณไม่ได้กระทำและมันก็แก้ปัญหาได้


แปลก!?! มาในข้อผิดพลาดนี้เช้านี้ มีความมุ่งมั่นเมื่อวานนี้จึงไม่มีการเปลี่ยนแปลงข้อผูกมัด ทำสิ่งต่อไปนี้: git stash ... ร้ายแรง: ไม่สามารถสร้าง '/ home / <user> /.git/index.lock': การ touch .git/a สัมผัส ข้อผิดพลาดอินพุต / เอาต์พุต: ไม่สามารถแตะ '.git / a': ข้อผิดพลาดอินพุต / เอาต์พุตsudo touch /home/guest/.git/a ไม่ผิดพลาด git stash ไม่มี การเปลี่ยนแปลงในท้องถิ่นเพื่อบันทึก git status ... ไม่มีอะไรให้คอมมิทไดเรกทอรีทำงานทำความสะอาด
go2null

1
@ go2null ฉันจะสายนี้ แต่ข้อผิดพลาด Input / Output โดยทั่วไปหมายถึงปัญหาฮาร์ดไดรฟ์ แม้ว่าตอนนี้ฉันแน่ใจว่าคุณจะรู้เรื่องนี้แล้ว
arleslie

"ไม่สามารถบันทึกสถานะดัชนีปัจจุบัน"
Vladimir Brasil

9

การรวบรวมขยะแก้ไขปัญหาของฉัน:

git gc --aggressive --prune=now

ใช้เวลาสักครู่ให้เสร็จสมบูรณ์ แต่ทุกวัตถุที่หลวมและ / หรือดัชนีที่เสียหายได้รับการแก้ไข


นี่เป็นทางออกที่ดี ทำงานให้ฉัน ระบบของฉันปิดโดยไม่ตั้งใจ อย่างไรก็ตามคำสั่งนี้ช่วยฉันจากการโคลนและงานหนักทั้งหมดเหล่านั้น ขอบคุณจาโก
Mukesh Kumar

"ไม่สามารถเรียกใช้ reflog"
Vladimir Brasil

5

เพียงแค่เรียกใช้git pruneแก้ไขปัญหานี้ให้ฉัน


สิ่งนี้ได้ผลกับฉันและดูเหมือนว่าเป็นวิธีที่ง่ายที่สุด ไม่แน่ใจว่าทำไมคำตอบนี้ไม่ได้รับคะแนนมากขึ้น ข้อเสียเปรียบเพียงอย่างเดียวคือการต่อไปgit pullใช้เวลานานกว่าปกติฉันคิดว่าเพราะมันแทนที่วัตถุที่ถูกลบหรืออะไรบางอย่าง
steev

1
เหตุผลอาจเป็นได้ว่าลูกพรุน git ไม่สามารถแก้ปัญหาได้เลย
user3072843

4

ฉันเพิ่งพบสิ่งนี้ - เครื่องของฉันพังขณะที่เขียนถึง 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" ในรายงานเหล่านี้เป็นผลมาจากการคืนเงินของคุณและแก้ไขในโฟลเดอร์นี้และตกลง ตัวรวบรวมขยะจะลบออกในเวลาอันควร

ดังนั้น (อย่างน้อยในกรณีของฉัน) ต้นไม้ที่เสียหายไม่ได้หมายความว่าความมุ่งมั่นที่ไม่ได้ชำระจะหายไป


3

ฉันได้รับข้อผิดพลาดของวัตถุที่หลวมที่เสียหายเช่นกัน

./objects/x/x

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

นี่อาจเป็นการแก้ไขที่เป็นไปได้สำหรับปัญหาของบางคน แต่ไม่จำเป็นทั้งหมด


2

ฉันได้รับข้อผิดพลาดนี้หลังจากที่เครื่อง (windows) ตัดสินใจที่จะรีบูตตัวเอง โชคดีที่ repo ระยะไกลของฉันเป็นรุ่นล่าสุดดังนั้นฉันเพิ่งทำโคลนคอมไพล์ใหม่ ..



2

ฉันทำตามขั้นตอนอื่น ๆ อีกมากมายที่นี่; คำอธิบายของ Linus เกี่ยวกับวิธีการดูต้นไม้ / สิ่งของคอมไพล์และค้นหาสิ่งที่ขาดหายไปนั้นมีประโยชน์อย่างยิ่ง git-git กู้คืน blob ที่เสียหาย

แต่ในที่สุดสำหรับฉันฉันมีวัตถุต้นไม้ที่หลวม / เสียหายที่เกิดจากความล้มเหลวของดิสก์บางส่วนและวัตถุต้นไม้นั้นไม่สามารถกู้คืนได้ง่าย / ไม่ครอบคลุมโดย doc นั้น

ในที่สุดฉันก็ย้ายสิ่งที่ขัดแย้งกันobjects/<ha>/<hash>ออกไปและใช้git unpack-objectsกับไฟล์แพ็คจากโคลนที่ทันสมัยจนถึงปัจจุบัน มันสามารถกู้คืนวัตถุต้นไม้ที่หายไปได้

ยังคงทิ้งฉันไว้กับ blobs ที่ห้อยต่องแต่งจำนวนมากซึ่งอาจเป็นผลข้างเคียงของการคลายสิ่งที่ถูกเก็บถาวรก่อนหน้านี้และตอบคำถามอื่น ๆที่นี่


2

ในคำตอบของ @ user1055643 ขาดขั้นตอนสุดท้าย:

$ rm -fr .git
$ git init
$ git remote add origin your-git-remote-url
$ git fetch
$ git reset --hard origin/master
$ git branch --set-upstream-to=origin/master master  

--set-upstream-to อาร์กิวเมนต์ที่ถูกต้องคืออะไร? ฉันไม่คิดอย่างนั้น!
Sharif Mamun

2
สาขา git (--set-upstream-to = <upstream> | -u <upstream>) [<branchname>]
ErtuğrulAltınboğa

หากคุณลบ.gitและคัดลอกจากโครงการที่ลอกเลียนแบบ repo จะใช้งานได้ แต่จะไม่มีสาขาใดในท้องที่
Vladimir Vukanac

1

เราเพิ่งมีกรณีที่นี่ มันเกิดขึ้นว่าปัญหาคือความเป็นเจ้าของไฟล์ที่เสียหายคือรูทแทนที่จะเป็นผู้ใช้ปกติของเรา สิ่งนี้เกิดจากการกระทำที่ทำบนเซิร์ฟเวอร์หลังจากที่มีคนทำ "sudo su -"

ก่อนอื่นให้ระบุไฟล์ที่เสียหายของคุณด้วย:

$> git fsck --full

คุณควรได้รับคำตอบเช่นนี้:

fatal: loose object 11b25a9d10b4144711bf616590e171a76a35c1f9 (stored in .git/objects/11/b25a9d10b4144711bf616590e171a76a35c1f9) is corrupt

ไปที่โฟลเดอร์ที่ไฟล์เสียหายและทำ:

$> ls -la

ตรวจสอบความเป็นเจ้าของไฟล์ที่เสียหาย ถ้ามันแตกต่างกันเพียงแค่กลับไปที่รากของ repo ของคุณและทำ:

$> sudo chown -R YOURCORRECTUSER:www-data .git/

หวังว่ามันจะช่วย!


1

git pushให้ฉันนี้เกิดขึ้นเนื่องจากความล้มเหลวอำนาจขณะที่ทำ

ข้อความดูเหมือนว่านี้:

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

ฉันลองทำสิ่งที่ชอบgit fsckแต่ก็ไม่ได้ช่วยอะไร เนื่องจากความผิดพลาดเกิดขึ้นระหว่าง a git push, มันเกิดขึ้นอย่างชัดเจนระหว่างการเขียนบนฝั่งไคลเอ็นต์ซึ่งเกิดขึ้นหลังจากเซิร์ฟเวอร์อัพเดท ผมมองไปรอบ ๆ และคิดว่าในกรณีของฉันเป็นวัตถุกระทำเพราะมันถูกอ้างถึงโดยรายการในc2388 .git/refsดังนั้นฉันรู้ว่าฉันจะสามารถหาได้c2388เมื่อฉันดูประวัติ (ผ่านเว็บอินเตอร์เฟสหรือโคลนนิ่งที่สอง)

บนโคลนที่สองผมเพื่อแจ้งบรรพบุรุษของgit log -n 2 c2388 c2388แล้วฉันจะมีการปรับเปลี่ยนด้วยตนเอง.git/refs/heads/masterและ.git/refs/remotes/origin/masterจะเป็นบรรพบุรุษของแทนc2388 แล้วฉันจะทำc2388 ล้มเหลวกี่ครั้งความขัดแย้งบนวัตถุที่ว่างเปล่า ฉันนำวัตถุว่างเปล่าเหล่านี้ออกแต่ละชิ้นจนสำเร็จ ที่รักษาพื้นที่เก็บข้อมูลแล้วgit fetchgit fetchgit fetch


1

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


0

ฉันมีปัญหาเดียวกันนี้ใน repo คอมไพล์ทางไกลของฉัน หลังจากการแก้ไขปัญหามากฉันคิดว่าหนึ่งในเพื่อนร่วมงานของฉันได้กระทำการที่ไฟล์บางไฟล์ใน. git / วัตถุมีสิทธิ์ 440 (r - r -----) แทนที่จะเป็น 444 (r - r - r -) หลังจากขอให้ผู้ร่วมงานเปลี่ยนสิทธิ์ด้วย "chmod 444 -R objects" ใน repo คอมไพล์เปลือยปัญหาได้รับการแก้ไข


0

ฉันเพิ่งมีปัญหาเช่นนี้ ปัญหาเฉพาะของฉันเกิดจากความผิดพลาดของระบบที่ทำลายการกระทำล่าสุด (และด้วยเหตุนี้ยังเป็นสาขาหลัก) ฉันไม่ได้ผลักและต้องการที่จะทำให้การกระทำนั้นอีกครั้ง ในกรณีเฉพาะของฉันฉันสามารถจัดการกับมันได้เช่นนี้:

  1. สำรองข้อมูลของ.git/:rsync -a .git/ git-bak/
  2. ตรวจสอบ.git/logs/HEADและค้นหาบรรทัดสุดท้ายด้วยรหัสยืนยันที่ถูกต้อง สำหรับฉันนี่เป็นความมุ่งมั่นล่าสุดครั้งที่สอง นี่เป็นสิ่งที่ดีเพราะฉันยังมีไฟล์ไดเรกทอรีที่ใช้งานได้และทุกรุ่นที่ฉันต้องการ
  3. ทำให้สาขาที่กระทำ: git branch temp <commit-id>
  4. ทำคอมมิตที่เสียหายกับไฟล์ในไดเร็กทอรีการทำงานอีกครั้ง
  5. git reset master temp เพื่อย้ายสาขาหลักไปยังการส่งมอบใหม่ที่คุณทำในขั้นตอนที่ 2
  6. git checkout mastergit logและตรวจสอบว่ามันมีลักษณะที่เหมาะสมกับ
  7. git branch -d temp.
  8. git fsck --fullและตอนนี้ควรปลอดภัยที่จะลบวัตถุที่เสียหายที่ fsck ค้นหา
  9. หากทุกอย่างดูดีลองกด หากใช้งานได้

ที่ทำงานให้ฉัน ฉันสงสัยว่านี่เป็นสถานการณ์ทั่วไปที่สมเหตุสมผลเนื่องจากการกระทำครั้งล่าสุดเป็นสิ่งที่น่าจะเกิดความเสียหายมากที่สุด แต่ถ้าคุณเสียไปอีกหนึ่งครั้งคุณอาจยังคงใช้วิธีการเช่นนี้ด้วยความระมัดระวังgit cherrypickและ reflog ใน.git/logs/HEAD.


0

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


0

ฉันพบสิ่งนี้เมื่อระบบของฉันล้มเหลว สิ่งที่ฉันทำคือ:

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

  • สำรองรหัสของคุณ
  • ไปที่ไดเรกทอรีทำงานและลบ.gitโฟลเดอร์
  • ตอนนี้ทำการโคลนรีโมตในตำแหน่งอื่นและคัดลอก.gitโฟลเดอร์ในนั้น
  • วางลงในไดเรกทอรีทำงานของคุณ
  • กระทำตามที่คุณต้องการ

-7

เพียงแค่ลบ. git โฟลเดอร์และเพิ่มอีกครั้ง วิธีแก้ปัญหาง่ายๆนี้ใช้ได้สำหรับฉัน


3
สิ่งนี้จะทำให้ที่เก็บในเครื่องของคุณ ... อาจมีผลข้างเคียงที่ไม่ต้องการ :) โปรดแก้ไขข้อเสนอของคุณและเพิ่มคำเตือนนั้น
เฟลิกซ์

1
หากคุณลบ.gitและคัดลอกจากโครงการที่ลอกเลียนแบบแล้ว repo จะทำงานได้ แต่จะไม่มีสาขาใดในท้องที่ นอกจากนี้ยังมีข้อเสนอแนะที่เป็นมิตรลบคำตอบของคุณอย่างสมบูรณ์เพื่อหยุดการลงคะแนน
Vladimir Vukanac

1
Whoa nelly ... พูดคุยเกี่ยวกับการใช้ปืนยิงรถถังสำหรับงานแหนบ
Tuncay Göncüoğlu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.