我遇到了类似的问题。我的笔记本在执行 Git 操作期间没电了。糟糕。
我没有任何备份。(顺便提一下,Ubuntu One 不是 Git 的备份解决方案;它会很有帮助地用你的损坏版本库覆盖你正常的版本库)
如果对于 Git 高手们来说这种修复方式不好,请留言告诉我。但是至少在我这里,它起到了作用…… 至少是暂时的。
步骤1:备份文件夹 .git(事实上,我在每个更改步骤之间都会这样做,但是会使用新的复制名称,例如 .git-old-1、.git-old-2 等):
cd ~/workspace/mcmc-chapter
cp -a .git .git-old
步骤二:运行git fsck --full
git fsck --full
error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e is empty
fatal: loose object 8b61d0135d3195966b443f6c73fb68466264c68e (stored in .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) is corrupt
步骤三:删除空文件。我想算了,反正里面什么也没有。
rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e
rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y
第三步:再次运行git fsck
。继续删除空文件。您还可以进入.git
目录并运行find . -type f -empty -delete -print
来删除所有空文件。最终,Git开始告诉我它实际上正在处理对象目录:
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
第四步:在删除了所有空文件后,我最终执行了git fsck
命令:
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
命令。失败,因为我的 HEAD 损坏了。
git reflog
fatal: bad object HEAD
第六步: 使用谷歌。找到这个页面。手动获取reflog的最后两行:
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
第七步:请注意,从第六步我们知道HEAD目前指向最后一个提交。因此,让我们尝试查看父提交:
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。
git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d
看看 fsck 说了什么:
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指针似乎来自于一个现在已过时的索引文件(来源)。因此,我将其删除并重置了仓库。
rm .git/index
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...
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
悬空的blob不是错误。我不担心master.u1conflict,现在它已经工作了,我不想再碰它了!
步骤12:追赶我的本地编辑:
git status
< ... snip ... >
no changes added to commit (use "git add" and/or "git commit -a")
git commit -a -m "recovering from the git fiasco"
[master 7922876] recovering from the git fiasco
3 files changed, 12 insertions(+), 94 deletions(-)
git add tex/sept2012_code/example-code-testing.R
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
git fsck
解决了这个问题。 - Jake Anderson