วิธีแก้ไขข้อผิดพลาด GIT: ไฟล์อ็อบเจ็กต์ว่างเปล่า


442

เมื่อฉันพยายามที่จะทำการเปลี่ยนแปลงฉันได้รับข้อผิดพลาดนี้:

error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt

ความคิดใดวิธีการแก้ไขข้อผิดพลาดนี้?

แก้ไข

ฉันพยายามgit fsckฉันได้:

error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt

คุณบังคับให้ฆ่าการgit addผ่าตัดหรือไม่? ฮาร์ดดิสก์ของคุณเต็มหรือไม่
cdhowie

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

ไม่มีข้อผิดพลาดยังคงมี ...
simo

2
หากพื้นที่เก็บข้อมูลนี้มีอยู่ในพื้นที่เก็บข้อมูลระยะไกลคุณสามารถลองคัดลอกไฟล์นั้นจากที่นั่นไปยังพื้นที่ท้องถิ่นของคุณถ้ามีอยู่ในพื้นที่เก็บข้อมูลระยะไกลของคุณ
Attila Szeremi

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

คำตอบ:


900

ฉันมีปัญหาที่คล้ายกัน แล็ปท็อปของฉันแบตเตอรี่หมดในระหว่างการใช้งานคอมไพล์ หุยฮา

ฉันไม่มีข้อมูลสำรอง (NB Ubuntu One ไม่ใช่โซลูชันสำรองสำหรับ git มันจะช่วยเขียนทับพื้นที่เก็บข้อมูลที่มีสติกับของคุณที่เสียหาย)

สำหรับวิซาร์ดคอมไพล์ถ้านี่เป็นวิธีที่ไม่ดีในการแก้ไขโปรดแสดงความคิดเห็น อย่างไรก็ตามมันใช้ได้กับฉัน ... อย่างน้อยก็ชั่วคราว

ขั้นตอนที่ 1: ทำการสำรองข้อมูลของ. git (อันที่จริงฉันทำสิ่งนี้ในระหว่างทุกขั้นตอนที่เปลี่ยนแปลงบางอย่าง แต่ด้วยชื่อคัดลอกไปยังใหม่เช่น. git-old-1, .git-old-2 เป็นต้น) :

cp -a .git .git-old

ขั้นตอนที่ 2: เรียกใช้ git fsck --full

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e is empty
fatal: loose object 8b61d0135d3195966b443f6c73fb68466264c68e (stored in .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) is corrupt

ขั้นตอนที่ 3: ลบไฟล์เปล่า ฉันคิดว่าห่า; มันว่างเปล่าอยู่ดี

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e 
rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y

ขั้นตอนที่ 3: เรียกใช้git fsckอีกครั้ง ทำการลบไฟล์เปล่าต่อไป คุณยังสามารถcdเข้าไปใน.gitไดเรกทอรีและเรียกใช้find . -type f -empty -delete -printเพื่อลบไฟล์เปล่าทั้งหมด ในที่สุดคอมไพล์ก็เริ่มบอกฉันว่าจริง ๆ แล้วมันกำลังทำอะไรบางอย่างกับไดเรกทอรีวัตถุ:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: object file .git/objects/e0/cbccee33aea970f4887194047141f79a363636 is empty
fatal: loose object e0cbccee33aea970f4887194047141f79a363636 (stored in .git/objects/e0/cbccee33aea970f4887194047141f79a363636) is corrupt

ขั้นตอนที่ 4: หลังจากลบไฟล์เปล่าทั้งหมดในที่สุดฉันก็มาถึงgit fsckทำงานจริง:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: HEAD: invalid sha1 pointer af9fc0c5939eee40f6be2ed66381d74ec2be895f
error: refs/heads/master does not point to a valid object!
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

ขั้นตอนที่ 5: git reflogลอง ล้มเหลวเนื่องจากส่วนหัวของฉันเสีย

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reflog
fatal: bad object HEAD

ขั้นตอนที่ 6: Google ค้นหานี้ รับการอ้างอิงสองบรรทัดสุดท้ายด้วยตนเอง:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ tail -n 2 .git/logs/refs/heads/master
f2d4c4868ec7719317a8fce9dc18c4f2e00ede04 9f0abf890b113a287e10d56b66dbab66adc1662d Nathan VanHoudnos <nathanvan@gmail.com> 1347306977 -0400  commit: up to p. 24, including correcting spelling of my name
9f0abf890b113a287e10d56b66dbab66adc1662d af9fc0c5939eee40f6be2ed66381d74ec2be895f Nathan VanHoudnos <nathanvan@gmail.com> 1347358589 -0400  commit: fixed up to page 28

ขั้นตอนที่ 7: โปรดทราบว่าจากขั้นตอนที่ 6 เราได้เรียนรู้ว่า HEAD กำลังชี้ไปที่การกระทำสุดท้าย ดังนั้นให้ลองดูที่ผู้ปกครองกระทำ:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git show 9f0abf890b113a287e10d56b66dbab66adc1662d
commit 9f0abf890b113a287e10d56b66dbab66adc1662d
Author: Nathan VanHoudnos <nathanvan@XXXXXX>
Date:   Mon Sep 10 15:56:17 2012 -0400

    up to p. 24, including correcting spelling of my name

diff --git a/tex/MCMC-in-IRT.tex b/tex/MCMC-in-IRT.tex
index 86e67a1..b860686 100644
--- a/tex/MCMC-in-IRT.tex
+++ b/tex/MCMC-in-IRT.tex

มันได้ผล!

ขั้นตอนที่ 8: ตอนนี้เราต้องกำหนด HEAD ไปที่ 9f0abf890b113a287e10d56b66dbab66adc1662d

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d

ซึ่งไม่ได้บ่น

ขั้นตอนที่ 9: ดูว่า fsck พูดว่าอะไร:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

ขั้นตอนที่ 10: ตัวชี้ sha1 ที่ไม่ถูกต้องในแคชทรีดูเหมือนว่ามาจากไฟล์ดัชนี (ที่ล้าสมัยแล้ว) ( แหล่งที่มา ) ดังนั้นฉันจึงฆ่ามันและรีเซ็ต repo

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/index
nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reset
Unstaged changes after reset:
M   tex/MCMC-in-IRT.tex
M   tex/recipe-example/build-example-plots.R
M   tex/recipe-example/build-failure-plots.R

ขั้นตอนที่ 11: ดู fsck อีกครั้ง ...

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a

blobs ห้อยไม่ได้ข้อผิดพลาด ฉันไม่ได้กังวลกับ master.u1conflict และตอนนี้มันใช้งานได้ฉันไม่ต้องการสัมผัสอีกต่อไป!

ขั้นตอนที่ 12: ติดตามการแก้ไขในท้องถิ่นของฉัน:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   tex/MCMC-in-IRT.tex
#   modified:   tex/recipe-example/build-example-plots.R
#   modified:   tex/recipe-example/build-failure-plots.R
#
< ... snip ... >
no changes added to commit (use "git add" and/or "git commit -a")


nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "recovering from the git fiasco"
[master 7922876] recovering from the git fiasco
 3 files changed, 12 insertions(+), 94 deletions(-)

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git add tex/sept2012_code/example-code-testing.R
nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "adding in the example code"
[master 385c023] adding in the example code
 1 file changed, 331 insertions(+)
 create mode 100644 tex/sept2012_code/example-code-testing.R

หวังว่าจะเป็นประโยชน์กับผู้คนในอนาคต ฉันดีใจที่มันทำงาน


86
คำตอบที่ยอดเยี่ยมพร้อมกับทุกขั้นตอนและทั้งหมด ฉันคิดว่าคุณช่วยฉันให้พ้นจาก googling ทุกคน!
Zlatko

24
ทำงานเหมือนจับใจ! ฉันหวังว่าฉันจะ
โหวตได้

1
อืมแล็ปท็อปของฉันเสียชีวิตระหว่างการทำงานคอมไพล์ (SparkleShare พยายามส่งบันทึกของฉันเมื่อมันเสียชีวิต) และหลังจากนั้น repo ก็เสียหายเช่นนี้ ฉันทำตามขั้นตอนของคุณจนถึง 6 แต่ดูเหมือนว่าหลายคอมมิชชันล่าสุดนั้นควรจะเป็นส่วนหนึ่งของไฟล์ออบเจ็กต์เปล่าที่ฉันลบ ในความเป็นจริงการคอมมิท 3 ครั้งสุดท้ายนั้นเสียอย่างสมบูรณ์ดังนั้นฉันเดาว่าไม่มีอะไรที่ฉันจะทำได้ โชคดีที่ฉันไม่จำเป็นต้องใช้แต่ละคำสั่งจาก SparkleShare และฉันสามารถคัดลอกไฟล์สกปรกจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งและรวมเข้าด้วยกัน
อิบราฮิม

14
คำตอบที่ดีเลิศ ขอขอบคุณอย่างยิ่งสำหรับการรวมเหตุผลของคุณไว้ในแต่ละขั้นตอน คุณได้บันทึก repo ของฉัน! (ดีฉันยังคงมีข้อผิดพลาด 'อ้างอิงที่ไม่ดีสำหรับ refs / heads / master' จาก fsck แต่นั่นค่อนข้างเบา)
Jon Carter

3
ขอบคุณฉันได้เรียนรู้มากมายเกี่ยวกับฟังก์ชั่นคอมไพล์บางส่วนในขณะเดียวกันก็ช่วยเบคอนของฉันในการกระทำที่สำคัญ! บังเอิญมันเป็นเพราะแบตเตอรี่ต่ำในแล็ปท็อป
HarbyUK

195

ไฟล์ออบเจ็กต์ git นั้นได้รับความเสียหาย สิ่งนี้สามารถเกิดขึ้นได้ในระหว่างที่เครื่องขัดข้อง ฯลฯ

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

(อย่าลืมสำรองโฟลเดอร์ที่เก็บ git ของคุณก่อน!)

find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full

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

PS คำตอบนี้แสดงให้เห็นว่าคุณมีสำเนาระยะไกลของที่เก็บ git ของคุณ (เช่นบน GitHub) และที่เก็บที่เสียหายคือพื้นที่เก็บข้อมูลในท้องถิ่นที่เชื่อมโยงกับพื้นที่เก็บข้อมูลระยะไกลซึ่งยังอยู่ในชั้นเชิง หากไม่ใช่กรณีนั้นอย่าพยายามแก้ไขตามที่ฉันแนะนำ


ขอบคุณสำหรับสิ่งนี้ฉันผลักดันกิ่งไม้ที่อยู่ห่างไกลออกไปอย่างเคร่งครัดและวิธีแก้ปัญหาของคุณก็ใช้ได้กับฉัน ฉันลอง @ mCorr ด้านล่างก่อน แต่หลังจากที่ฉันยืนยันไฟล์ใหม่ repo จะกลับไปเป็นความเสียหาย วิธีการนี้แก้ไขได้
mr_than

เป็นส่วนใหญ่มีระยะไกล วิธีนี้สะอาดและเพียงพอจริงๆ
jackOfAll

7
มีปัญหานี้หลังจากปิด VM ซึ่งฉันทำงานกับ repo คอมไพล์ วิธีนี้ใช้ได้ผลอย่างสมบูรณ์
Giscard Biamby

ขอบคุณ Martin โซลูชั่นที่ยอดเยี่ยมและกะทัดรัด แม้ว่าฉันจะให้ PS เป็นอันดับแรกโดยมีคำเตือนเป็นตัวหนาเพื่อป้องกันผู้ใช้ที่ไร้เดียงสาที่พยายามทำสิ่งเดียวกันในการตั้งค่าแบบท้องถิ่น เช่นเดียวกับ Giscard สิ่งนี้เกิดขึ้นสำหรับฉันเมื่อปิด VM ... จะอัปเดตหากฉันพบวิธีแก้ไขปัญหาที่ถาวรมากกว่าการทำสิ่งนี้ทุกครั้ง
thclark

2
VM crush ทำสิ่งนี้กับ git repo ในพื้นที่ของฉันฉันสามารถยืนยันได้ว่าโซลูชันนี้ทำงานได้ 100% ในกรณีนั้น
Amin.T

35

ข้อผิดพลาดนี้เกิดขึ้นกับฉันเมื่อฉันผลักภาระของฉันและคอมพิวเตอร์ของฉันค้าง นี่คือวิธีที่ฉันแก้ไข


ขั้นตอนในการแก้ไข

git status

แสดงไฟล์วัตถุที่ว่างเปล่า / เสียหาย

rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12

ย้ายมัน

git status

ฉันได้รับfatal: bad object HEADข้อความ

rm .git/index

ฉันลบindexการรีเซ็ต

git reset

ร้ายแรง: ไม่สามารถแยกวิเคราะห์ 'HEAD' ของวัตถุ

git status
git pull

เพียงเพื่อตรวจสอบสิ่งที่เกิดขึ้น

tail -n 2 .git/logs/refs/heads/MY-CURRENT-BRANCH

พิมพ์ 2 บรรทัดสุดท้ายtail -n 2ของบันทึกสาขาเพื่อแสดง 2 ล่าสุดของฉันcommit hash

git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2

ฉันเลือกอันสุดท้าย commit hash

git status

แสดงไฟล์ทั้งหมดของฉันdeletedเพราะฉันลบ.git/indexไฟล์

git reset

ทำการรีเซ็ตต่อไป

git status

ตรวจสอบการแก้ไขของฉัน


หมายเหตุ: ขั้นตอนเริ่มต้นเมื่อฉันไปถึงคำถามนี้และใช้คำตอบเป็นข้อมูลอ้างอิง


34

ฉันแก้ไขการลบไฟล์ว่างต่าง ๆ ที่ git fsck ตรวจจับแล้วเรียกใช้ git pull อย่างง่าย

ฉันพบว่ามันน่าผิดหวังที่ตอนนี้แม้แต่ระบบไฟล์ยังใช้ journaling และเทคนิคการทำธุรกรรม "อื่น ๆ " เพื่อรักษา fs sane, git สามารถเข้าสู่สถานะที่เสียหายได้ (และไม่สามารถกู้คืนได้ด้วยตนเอง) เนื่องจากไฟฟ้าดับหรือพื้นที่บนอุปกรณ์


3
ฉันแน่ใจว่าคำตอบข้างต้นดีกว่าในทางเทคนิค แต่มันหยุดทำงานในขั้นตอนที่ 6 และเป็นวิธีที่เหนือหัวฉันในทางเทคนิค วิธีที่สะดวกคือ git pull
mblackwell8

2
ฉันพบสถานการณ์ที่หลังจากทำตามขั้นตอนที่ 1-11 ของคำแนะนำจากคำตอบของนาธาน (ซึ่งใช้งานได้ดีมาก!) ฉันมีข้อผิดพลาดที่บอกว่าการอ้างอิง / แหล่งกำเนิด / ต้นแบบและการอ้างอิง / แหล่งกำเนิด / หัวไม่ได้กำหนดไว้ ที่). git pull นั้นได้รับการแก้ไข ดังนั้นฉันคิดว่าวิธีแก้ปัญหาทั้งสองทำงานร่วมกัน
bchurchill

2
ฉันทราบว่าระบบไฟล์ที่ใช้มักจะทำบันทึกข้อมูลเมตาเท่านั้น คุณสามารถเปิดการทำเจอร์นัลสำหรับข้อมูลได้เช่นกัน แต่ฉันเดาว่ามันไม่ได้เป็นค่าเริ่มต้นเนื่องจากโอเวอร์เฮด (?) นั่นอาจเป็นสาเหตุที่ไฟล์ว่างเปล่า .... และระบบไฟล์มักจะสังเกตเห็นธุรกรรมต่อไฟล์ในขณะที่ git มีหลายไฟล์ ต่อธุรกรรมดังนั้นแม้ว่า fs จะมีความสอดคล้องกันต่อไฟล์ถ้า git ไม่ได้ฉันก็เดาว่า git จะส่งผลให้เกิดสถานะที่ไม่สอดคล้องกัน ...
Heartinpiece

คำตอบนี้ใช้ได้สำหรับฉันคนอื่น ๆ มีวิธีที่ซับซ้อน
ldog

1
วิธีแก้ปัญหาเร็วกว่าคำตอบที่ยอมรับ สำหรับทุกคนที่เลื่อนมาถึงตอนนี้ให้ทำตามคำตอบนี้ถ้าคุณรีบ
Sri Harsha Kappala

9

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

วิธีที่ฉันแก้ไขปัญหานี้คือ:

  1. คอมไพล์สะสม
  2. การลบไฟล์ git โดยมีข้อผิดพลาด (ไม่แน่ใจว่าจำเป็น)
  3. คอมไพล์สะสมชัดเจน

ฉันไม่รู้ว่าเกิดอะไรขึ้น แต่คำแนะนำนั้นดูเหมือนจะทำให้ทุกอย่างสะอาด


2
ฉันชอบคำตอบที่ง่ายกว่าเสมอ :) สำหรับขั้นตอนที่ 2 ที่นี่ฉันใช้คำสั่งที่ให้ไว้ใน @Nathan VanHoudnos คำตอบของ:cd .git/ && find . -type f -empty -delete
mopo922

8

เพราะฉันต้องรีบูต VM เป็นประจำดังนั้นปัญหานี้เกิดขึ้นกับฉันบ่อยมาก หลังจากผ่านไปสองสามครั้งฉันก็ตระหนักว่าฉันไม่สามารถทำซ้ำกระบวนการที่อธิบายโดย @ Nathan-Vanhoudnos ทุกครั้งที่เกิดเหตุการณ์นี้แม้ว่ามันจะใช้งานได้เสมอ จากนั้นฉันหาวิธีแก้ปัญหาที่เร็วกว่านี้

ขั้นตอนที่ 1

ย้าย repo ทั้งหมดของคุณไปยังโฟลเดอร์อื่น

mv current_repo temp_repo

ขั้นตอนที่ 2

โคลน repo จากแหล่งกำเนิดอีกครั้ง

git clone source_to_current_repo.git

ขั้นตอนที่ 3

ลบทุกอย่างภายใต้ repo ใหม่ยกเว้นโฟลเดอร์. git

ขั้นตอนที่ 4

ย้ายทุกอย่างจากtemp_repoไป repo ใหม่ยกเว้น.gitโฟลเดอร์

ขั้นตอนที่ 5

ลบtemp_repoและเราเสร็จแล้ว

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


2
หรือไม่ย้าย repo ปัจจุบันของคุณ 1) สร้างโคลนใหม่git clone source_to_current_repo.git clean_repo2) สำรองข้อมูลโฟลเดอร์. git เก่า 3) คัดลอกไปที่โฟลเดอร์. git ใหม่ทั้งหมด
moi

คุณพูดถูก ฉันทำไปแล้ว จะแก้ไขคำตอบในภายหลัง
haoqiang

@ Haoqiang: คุณเขียนว่า "เพราะฉันต้องรีบูต VM เป็นประจำดังนั้นปัญหานี้มักเกิดขึ้นกับฉันบ่อยมาก" เราสัมผัสเหมือนกัน คุณมีความคืบหน้าเกี่ยวกับสาเหตุที่แท้จริงหรือไม่ - การตั้งค่า VM ที่ทำให้เกิดปัญหาน้อยลง
hansfn

6
  1. mv แอพโฟลเดอร์ของคุณเพื่อทำการสำรองข้อมูลเช่นmv app_folder app_folder_bk (เป็นเหมือนstash git )
  2. คอมไพล์ your_repository
  3. สุดท้าย ,. เปิดเครื่องมือผสาน (ฉันใช้ meld diff Viewer linux หรือ Winmerge Windows) และคัดลอกการเปลี่ยนแปลงจากด้านขวา ( app_folder_bk ) ไปทางซ้าย ( app_folderใหม่) (เหมือนการใช้git stash )

นั่นคือทั้งหมดที่ บางทีมันอาจไม่ใช่วิธีที่ดีที่สุด แต่ฉันคิดว่ามันใช้ได้จริง


1
นี่คือสิ่งที่คุณควรทำเมื่อมีการเปลี่ยนแปลงภายในเครื่องทั้งหมดที่ส่งไปยังอัปสตรีมหรือการเปลี่ยนแปลงน้อยที่สุดดังนั้นการโคลนจึงเร็วกว่าการกู้คืน
mu 無

3

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเนื่องจากฉันพิมพ์ข้อความการส่งข้อความและสมุดบันทึกของฉันถูกปิด

ฉันทำตามขั้นตอนเหล่านี้เพื่อแก้ไขข้อผิดพลาด:

  • git checkout -b backup-branch # สร้างสาขาสำรอง
  • git reset --hard HEAD~4# รีเซ็ตเป็นคอมมิชชันที่ทุกอย่างทำงานได้ดี ในกรณีของฉันฉันต้องย้อนกลับ 4 ข้อตกลงในหัวนั่นคือจนกว่าหัวของฉันจะอยู่ที่จุดก่อนที่ฉันจะพิมพ์ข้อความกระทำ ก่อนที่จะทำขั้นตอนนี้ให้คัดลอกแฮชของคอมมิทที่คุณจะรีเซ็ตในกรณีของฉันฉันคัดลอกแฮชของ 4 คอมมิตครั้งล่าสุด
  • git cherry-pick <commit-hash> # Cherry เลือกคอมมิตที่ลบแล้ว (ในกรณีของฉันคือ 4 คอมมิทดังนั้นฉันทำขั้นตอนนี้ 4 ครั้ง) จากสาขาเก่าไปยังสาขาใหม่
  • git push origin backup-branch # ผลักดันสาขาใหม่เพื่อให้แน่ใจว่าทุกอย่างทำงานได้ดี
  • git branch -D your-branch # ลบสาขาในพื้นที่ ('your-branch' เป็นสาขาที่มีปัญหา)
  • git push origin :your-branch # ลบสาขาจากระยะไกล
  • git branch -m backup-branch your-branch # เปลี่ยนชื่อสาขาสำรองเพื่อให้มีชื่อสาขาที่มีปัญหา
  • git push origin your-branch # ดันสาขาใหม่
  • git push origin :backup-branch # ลบสาขาสำรองจากระยะไกล

3
git stash
git checkout master
cd .git/ && find . -type f -empty -delete
git branch your-branch-name -D
git checkout -b your-branch-name
git stash pop

แก้ไขปัญหาของฉัน


สิ่งนี้ช่วย ขอบคุณ.
swateek

หาก repo สะอาดคุณเพียงแค่ต้อง "cd .git / && find. - พิมพ์ f -empty -delete && cd - && git pull" คุณอาจต้องชำระไฟล์บางไฟล์git statusเนื่องจากไฟล์บางไฟล์ว่างเปล่า
CodyChan

2

นี่เป็นวิธีที่ง่ายและรวดเร็วในการจัดการกับปัญหานี้หากคุณมี repo ในท้องถิ่นที่มีสาขาและคุณต้องการและถ้าคุณตกลงกับการสร้าง repo ใหม่ (หรือลบ repo ของเซิร์ฟเวอร์และสร้างใหม่ ในสถานที่):

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

สิ่งนี้จะรักษาประวัติความเป็นมาและกิ่งก้านที่คุณมีใน repo ท้องถิ่นของคุณ

หากคุณมีผู้ทำงานร่วมกันบน repo ฉันคิดว่าในหลาย ๆ กรณีผู้ทำงานร่วมกันทั้งหมดของคุณต้องทำคือเปลี่ยน URL ระยะไกลของ repo ท้องถิ่นของพวกเขาเช่นกันและเลือกที่จะผลักดันการกระทำใด ๆ

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


2

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

ฉันมีปัญหาเดียวกันหลังจากแล็ปท็อปของฉันล้มเหลว อาจเป็นเพราะเป็นพื้นที่เก็บข้อมูลขนาดใหญ่ฉันมีไฟล์วัตถุที่เสียหายไม่กี่ไฟล์ซึ่งปรากฏขึ้นทีละครั้งเมื่อโทรgit fsck --fullดังนั้นฉันจึงเขียนเชลล์ตัวเล็กซับหนึ่งเพื่อซับหนึ่งโดยอัตโนมัติ:

$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`

  • 2>&1 เปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดไปยัง stdout เพื่อให้สามารถ grep ได้
  • ตัวเลือก grep ที่ใช้:
    • -o ส่งกลับเฉพาะส่วนของบรรทัดที่ตรงกับจริงเท่านั้น
    • -E เปิดใช้งาน regexes ขั้นสูง
    • -m 1 ตรวจสอบให้แน่ใจว่ามีการส่งคืนการจับคู่แรกเท่านั้น
    • [0-9a-f]{2} จับคู่อักขระใด ๆ ระหว่าง 0 ถึง 9 และ a และ f หากมีสองตัวเกิดขึ้นพร้อมกัน
    • [0-9a-f]* ตรงกับจำนวนอักขระระหว่าง 0 ถึง 9 และ a และ f ที่เกิดขึ้นพร้อมกัน

มันยังคงลบเพียงหนึ่งไฟล์ในแต่ละครั้งดังนั้นคุณอาจต้องการที่จะเรียกมันในวงเช่น:

$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done

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

หากต้องการ "แก้ไข" สิ่งนี้ฉันเพิ่งเพิ่มการเรียกgit fsck --fullหลังจากแต่ละรอบเช่น: $ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done

ตอนนี้มันเร็วประมาณครึ่งหนึ่ง แต่มันจะเอาท์พุทว่าเป็น "สถานะ"

หลังจากนี้ฉันเล่นไปรอบ ๆ พร้อมกับข้อเสนอแนะในหัวข้อนี้และในที่สุดก็มาถึงจุดที่ฉันสามารถทำได้git stashและgit stash dropสิ่งต่างๆมากมาย

แก้ไขปัญหาแรกแล้ว

หลังจากนั้นฉันยังคงมีปัญหาต่อไปนี้: unable to resolve reference 'refs/remotes/origin/$branch': reference brokenซึ่งสามารถแก้ไขได้โดย $ rm \repo.git\refs\remotes\origin\$branch

$ git fetch

จากนั้นฉันก็ทำ $ git gc --prune=now

$ git remote prune origin

สำหรับการวัดที่ดีและ

git reflog expire --stale-fix --all

เพื่อกำจัดเมื่อทำงานerror: HEAD: invalid reflog entry $blubbgit fsck --full


2

ไปกันเถอะ .. เฉพาะกรณีที่คุณอัปโหลดซอร์สไปยัง repit git ระยะไกล

  1. สำรอง. git ของคุณ
  2. ตรวจสอบคอมไพล์ของคุณ

    git fsck --full
    
  3. ลบไฟล์วัตถุที่ว่างเปล่า (ทั้งหมด)

    rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e
    
  4. ตรวจสอบคอมไพล์ของคุณอีกครั้ง

    git fsck --full
    
  5. ดึงแหล่งที่มาของคุณจากคอมไพล์ระยะไกล

    git pull origin master
    

2

ฉันพบปัญหานี้มากกับเครื่องเสมือน

สำหรับฉันทำงานต่อไปนี้:

cd /path/to/your/project
rm -rf .git

หากคุณต้องการบันทึกการดาวน์โหลดด้วยตัวเอง - ไปที่ file explorer ของคุณและลบไฟล์ทั้งหมดในโฟลเดอร์ที่มีการคอมมิทแล้วและเก็บไว้ใน / / ผู้ขายและ / node_modules (ฉันทำงานกับผู้แต่งและ npm) โฟลเดอร์

จากนั้นเพียงแค่สร้าง repo ใหม่

git init

เพิ่มรีโมทของคุณ

git remote add origin ssh://git@github.com/YourUsername/repoName.git

และดึงสาขา / ทั้งหมดของมัน

git fetch origin somebranch

และตรวจสอบ

git checkout somebranch

จากนั้นคุณควรจะเป็นจุดก่อนที่ข้อผิดพลาด

หวังว่านี่จะช่วยได้

ความนับถือ.


1

ฉันพบปัญหาเดียวกันและใช้วิธีง่าย ๆ ในการแก้ไข ฉันพบว่ามีไฟล์ที่หายไปเหล่านั้นอยู่ในคอมพิวเตอร์ของเพื่อนร่วมทีม

ผม คัดลอกไฟล์เหล่านี้ทีละไฟล์ไปยังเซิร์ฟเวอร์ git (รวม 9 ไฟล์) และนั่นช่วยแก้ไขปัญหาได้


1

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

  1. เปลี่ยนชื่อไดเรกทอรีการทำงานปัจจุบัน ( old_projectสำหรับตัวอย่างนี้)
  2. git cloneโคลนพื้นที่เก็บข้อมูลภายในไดเรกทอรีใหม่โดยใช้
  3. บนบรรทัดรับคำสั่งเปลี่ยนไดเร็กทอรีการทำงานเป็นโปรเจ็กต์ที่สร้างขึ้นใหม่และสลับไปยังสาขาที่คุณทำงานอยู่
  4. คัดลอกไฟล์และไดเรกทอรีทั้งหมดภายในold_project(ยกเว้น.gitไดเรกทอรี) ไปยังไดเรกทอรีโครงการที่สร้างขึ้นใหม่
  5. ตรวจสอบสถานะแผนผังการทำงานของคุณ (โปรดทราบว่ามีการเปลี่ยนแปลงมากมายเกินกว่าที่คุณคาดไว้) จากนั้นทำการเปลี่ยนแปลง

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


1

นี่เป็นวิธีการแก้ปัญหาหาก repo สาธารณะของคุณบน github.com ทำงานได้ แต่ repo ในพื้นที่ของคุณเสียหาย ระวังให้ดีว่าคุณจะทำพันธสัญญาทั้งหมดที่คุณทำใน repo ในพื้นที่

เอาล่ะฉันมี repo หนึ่งตัวที่ให้ฉันนี้object empty errorและ repo เดียวกันบน github.com แต่ไม่มีข้อผิดพลาดนี้ ดังนั้นสิ่งที่ฉันทำก็คือการลอกแบบ repo ที่ทำงานจาก github จากนั้นก็คัดลอกทุกอย่างจาก repo ที่เสียหาย (ยกเว้นโฟลเดอร์. git) และวาง repo ที่ลอกเลียนแบบที่ทำงานอยู่

นี่อาจไม่ใช่โซลูชันที่ใช้งานได้จริง (เนื่องจากคุณลบการกระทำในระบบ) อย่างไรก็ตามคุณบำรุงรักษาโค้ดและการควบคุมเวอร์ชันที่ได้รับการซ่อมแซม

อย่าลืมสำรองข้อมูลก่อนที่จะใช้วิธีนี้


1

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

คุณเพียงแค่แทนที่.git/ไดเรกทอรีที่เสียหายด้วยไดเรกทอรีใหม่ทั้งหมด

ให้สมมติไดเรกทอรีต่อไปนี้สำหรับโครงการของคุณด้วยคอมไพล์ที่เสียหาย: projects/corrupt_git/

  1. cp projects/corrupt_git projects/backup - (เป็นทางเลือก) ทำการสำรองข้อมูล
  2. git clone [repo URL] projects/clean_git - เพื่อให้คุณได้รับ projects/clean_git
  3. rm -rf corrupt_git/.git/ - ลบโฟลเดอร์. git ที่เสียหาย
  4. mv clean_git/.git/ corrupt_git/ - ย้ายคอมไพล์ที่สะอาดไปที่ corrupt_git/.git
  5. git statusในprojects/corrupt_git- เพื่อให้แน่ใจว่าใช้งานได้

0

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

git remote -v
 origin git@github.com:rwldrn/idiomatic.js.git (fetch)
 origin git@github.com:rwldrn/idiomatic.js.git (push)

แล้วก็

mkdir mygitfolder.backup
cp mygitfolder/* mygitfolder.backup/
cd mygitfolder
rm -r * .git*
git init
git remote add origin git@github.com:rwldrn/idiomatic.js.git

จากนั้นรวมไฟล์ใหม่ด้วยตนเองแล้วพยายามเปิดคอมพิวเตอร์ของคุณ


rm -rf *อาจมีผลกระทบที่เลวร้ายมาก คุณหมายถึงอย่างนั้นจริงเหรอ?
tommyk

@tommyk จึงทำการคัดลอกข้อมูลสำรองไว้ก่อน ฉันเดาว่าไม่จำเป็นต้องใช้กำลัง
Shelvacu

0

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

git:(master) git stash


0

หากคุณมีการสำรองข้อมูล OLD และกำลังรีบ:

สร้างแบ็คอัปใหม่ของเส้นทางโปรเจ็กต์ปัจจุบันที่ใช้งานไม่ได้ของคุณ

  1. ย้ายของคุณ .gitไปที่ถังขยะ (ไม่ต้องลบ)
  2. สำเนา .gitจากข้อมูลสำรอง OLD
  3. git pull (จะสร้างความขัดแย้งผสาน)
  4. ย้ายแหล่งที่มาของคุณทั้งหมด (ทุกอย่างที่คุณใส่ในคอมไพล์) ไปที่ถังขยะ: ./src (ไม่ต้องลบ)
  5. คัดลอกแหล่งที่มาทั้งหมดของคุณ (ทุกสิ่งที่คุณใส่ในคอมไพล์) จากการสำรองข้อมูลใหม่
  6. ยอมรับ "การรวม" ทั้งหมดที่git guiกดและ ... ปรบมือของคุณ!

0

การแก้ปัญหาสิบสองขั้นตอนที่กล่าวมาข้างต้นช่วยฉันออกจากการจราจรติดขัดได้เช่นกัน ขอบคุณ ขั้นตอนสำคัญคือการป้อน:

git fsck --full 

และลบวัตถุที่ว่างเปล่าทั้งหมด

rm .git/objects/...

จากนั้นรับสองบรรทัดของโบย:

tail -n 2 .git/logs/refs/heads/master

ด้วยค่าที่ส่งคืน

git update-ref HEAD ...

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


0

ฉันแก้ไขข้อผิดพลาดของคอมไพล์: ไฟล์อ็อบเจ็กต์ว่างโดย:

  1. บันทึกสำเนาของไฟล์ทั้งหมดที่ฉันแก้ไขตั้งแต่การส่ง / ส่งสำเร็จครั้งล่าสุด
  2. การลบและการโคลนที่เก็บของฉันอีกครั้ง
  3. แทนที่ไฟล์เก่าด้วยไฟล์ที่แก้ไขแล้วของฉัน

ความหวังนี้ช่วยได้


0

เรื่องนี้ก็เกิดขึ้นกับฉันเกือบเป็นประจำ ยังไม่ได้ทำโพรโทคอลเมื่อสิ่งนี้เกิดขึ้นอย่างแน่นอน แต่ฉันสงสัยว่ามันจะเกิดขึ้นเมื่อใดก็ตามที่เครื่องเสมือนของฉันมี "ไม่คาดคิด" ถ้าฉันปิดหน้าต่าง VM (ฉันใช้ Ubuntu 18.04) และเริ่มใหม่อีกครั้งทุกสิ่ง (?) ใช้ได้เสมอ แต่ถ้าหน้าต่าง VM ยังคงเปิดอยู่เมื่อแล็ปท็อปของฉันถูกปิด (ระบบโฮสต์ Windows) ฉันพบปัญหานี้บ่อยครั้ง

ตามคำตอบทั้งหมดที่ให้ไว้ที่นี่:

  1. ขอบคุณ - พวกเขามีประโยชน์มาก ฉันมักจะบันทึกสำเนาของรหัสในเครื่องของคุณเรียกคืน repo จากระยะไกลและย้ายสำเนาสำรองกลับเข้าไปในโฟลเดอร์ภายในเครื่อง

  2. เนื่องจากปัญหาพื้นฐานไม่ใช่ปัญหา git แต่เป็นปัญหาเกี่ยวกับ VM และ / หรือ Linux ฉันสงสัยว่าจะไม่มีวิธีแก้ไขเหตุผลแทนที่จะเป็นอาการหรือไม่ ข้อผิดพลาดประเภทนี้ไม่ได้บ่งชี้ว่าการเปลี่ยนแปลงบางอย่างของระบบไฟล์ไม่ได้ "นำไปใช้" ในเวลาที่เหมาะสม แต่มีเพียงแคชเท่านั้น (ดูตัวอย่าง/unix/464184/are-file-edits-in-linux-directly-saved-into-disk ) - สำหรับฉันมันดูเหมือนว่าเครื่อง Linux เสมือนไม่มี fsynch สิ่งของบ่อยพอ ไม่ว่าจะเป็นปัญหาของ VirtualBox ของออราเคิล (ซึ่งทำงานได้ดีมาก) หรือระบบไฟล์ของแขกหรือการตั้งค่าบางอย่างซึ่งเราทุกคนมองข้าม แต่ฉันจะมีความสุขถ้าใครบางคนสามารถทำให้กระจ่างเกี่ยวกับเรื่องนี้


0

ที่จริงฉันมีปัญหาเดียวกัน มีสำเนาของรหัสของคุณก่อนที่จะลองนี้

ฉันแค่ทำ git reset HEAD~

ความมุ่งมั่นครั้งล่าสุดของฉันถูกยกเลิกแล้วฉันก็ยืนยันอีกครั้งแก้ปัญหาได้!


-5

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

หากคุณไม่สนใจที่จะรักษาความมุ่งมั่นในอดีตของคุณอยู่

rm -r .git

จากนั้นตอบว่าใช่สำหรับทุกสิ่งที่ถามเกี่ยวกับการลบไฟล์ที่ป้องกันการเขียน แก้ปัญหาได้ภายในไม่กี่นาที


3
อย่าทำอย่างนี้ถ้าคุณต้องการประวัติของคุณในการเจรจาต่อรอง
mu 無
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.