当我尝试提交更改时,我收到此错误:
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
答案 0 :(得分:801)
我有类似的问题。我的笔记本电脑在git操作期间没电了。嘘。
我没有任何备份。 (N.B. Ubuntu One不是git的备份解决方案;它将有助于用你损坏的存储库覆盖你的理智存储库。)
对于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
以删除所有空文件。最终git开始告诉我它实际上正在使用对象目录:
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。查找this。手动获取reflog的最后两行:
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指针似乎来自(现在已过时)索引文件(source)。所以我杀了它并重置了回购。
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
dangling blobs are not errors。我不关心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
所以希望将来可以对人们有所帮助。我很高兴它有效。
答案 1 :(得分:132)
git对象文件已损坏(正如其他答案中所指出的那样)。这可能发生在机器崩溃等情况下。
我有同样的事情。在阅读了其他热门答案之后,我找到了使用以下命令修复损坏的git存储库的最快方法(在包含.git
文件夹的git工作目录中执行):
(请务必先备份您的git存储库文件夹!)
find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full
这将首先删除导致整个存储库损坏的删除所有空对象文件,然后从获取丢失的对象(以及最新更改)远程存储库,然后执行完整的对象存储检查。在这一点上,这应该没有任何错误地成功(尽管可能仍有一些警告!)
PS。这个答案表明你有一个git存储库的远程副本 某处(例如在GitHub上),破碎的存储库是绑定到远程存储库的本地存储库,该存储库仍处于机智状态。如果不是这样,那么不要试图按照我推荐的方式修复它。
答案 2 :(得分:32)
我解决了这个问题,删除了git fsck正在检测的各种空文件,然后运行一个简单的git pull。
我觉得令人失望的是,即使文件系统实现日志记录和其他“事务”技术以保持fs理智,git也可能因为电源故障或空间而进入损坏状态(并且无法自行恢复)在设备上。
答案 3 :(得分:31)
当我按下提交并且计算机挂起时,这个错误发生在我身上。 这就是我修复它的方法。
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
验证我的修复
注意:当我登陆此问题并使用答案作为参考时,步骤就开始了。
答案 4 :(得分:8)
我遇到了同样的问题:在拉远远的存储库之后,当我做了一个git状态时,我得到了: “错误:对象文件(...)为空” “致命:松散的物体(......)已损坏”
我解决这个问题的方法是:
我不确切知道发生了什么事情,但这些说明似乎使一切都干净了。
答案 5 :(得分:7)
因为我必须定期重启我的VM,所以不知何故这个问题经常发生在我身上。经过几次,我意识到每次发生这种情况时我都不能重复@ Nathan-Vanhoudnos所描述的过程,尽管它总是有效的。然后我想出了以下更快的解决方案。
第1步
将整个仓库移动到另一个文件夹。
mv current_repo temp_repo
第2步
再次从原点克隆回购。
git clone source_to_current_repo.git
第3步
除了 .git 文件夹之外,删除新回购下的所有内容。
第4步
将所有内容从 temp_repo 移至新回购 .git 文件夹。
第5步
删除 temp_repo ,我们就完成了。
几次之后,我确信你可以很快完成这个程序。
答案 6 :(得分:5)
这就是全部。也许这不是最好的方式,但我认为它是如此实用。
答案 7 :(得分:5)
我在虚拟机上经常遇到这个问题。
对我来说,以下作品:
cd /path/to/your/project
rm -rf .git
如果要保存一些下载内容,请-进入文件资源管理器并删除已提交的文件夹中的所有文件,然后保留在/ vendor和/ node_modules(我与composer和npm一起使用)文件夹中。
然后只需创建一个新的仓库
git init
添加您的遥控器
git remote add origin ssh://git@github.com/YourUsername/repoName.git
并获取分支/全部
git fetch origin somebranch
然后查看
git checkout somebranch
那你应该在错误发生之前了。
希望这会有所帮助。
致谢。
答案 8 :(得分: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
#从远程答案 9 :(得分: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 it -o
仅返回实际匹配-E
启用高级正则表达式-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 $blubb
时摆脱git fsck --full
。
答案 10 :(得分:2)
在一个脚本中
#! /bin/sh
# Save git data
cp -r .git gitold
# Remove all empty git object files
find .git -type f -empty -delete -print
# Get current branch name
branchname=$(git branch --show-current)
# Get latest commit hash
commit=$(tail -2 .git/logs/refs/heads/jwt | awk '{ print $2 }' | tr -d '[:space:]')
# Set HEAD to this latest commit
git update-ref HEAD $commit
# Pull latest changes on the current branch (considering remote is origin)
git pull origin $branchname
echo "If everything looks fine you remove the git backup running :\n\
$ rm -rf gitold\n\
Otherwise restore it with:\n\
$ rm -rf .git; mv gitold .git"
答案 11 :(得分:2)
以下是处理此问题的一种非常简单快捷的方法 IF 您拥有所需的所有分支和提交的本地仓库,并且如果您可以创建新的仓库(或者删除服务器的repo并在其中创建一个新的repo:)
这会保留您在本地仓库中的所有提交历史记录和分支。
如果您在repo上有合作者,那么我认为在很多情况下,您的协作者所要做的就是更改其本地仓库的远程URL,并可选择推送他们拥有的服务器没有的任何提交。
当我遇到同样的问题时,这个解决方案对我有用。我有一个合作者。在我将本地仓库推送到新的远程仓库之后,他只是将他的本地仓库更改为指向远程仓库URL,一切正常。
答案 12 :(得分:1)
让我们变得简单..只有你将源代码上传到远程git repo
检查你的git
git fsck --full
删除空对象文件(全部)
rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e
再次检查你的git。
git fsck --full
从远程git中提取你的来源
git pull origin master
答案 13 :(得分:1)
我遇到同样的问题,我用一种非常简单的方法来修复它。我发现那些丢失的文件存在于我队友的计算机上。
我将这些文件逐个复制到git服务器(总共9个文件),这解决了问题。
答案 14 :(得分:1)
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
解决我的问题
答案 15 :(得分:1)
就我而言,保留本地提交历史记录对我而言并不重要。因此,如果这也适用于您,您可以将其作为上述解决方案的快速替代方案:
基本上,您只需将损坏的.git/
目录替换为干净的目录即可。
假设您的项目的git损坏了以下目录:projects/corrupt_git/
cp projects/corrupt_git projects/backup
-(可选)进行备份git clone [repo URL] projects/clean_git
-这样您就可以获得projects/clean_git
rm -rf corrupt_git/.git/
-删除损坏的.git文件夹mv clean_git/.git/ corrupt_git/
-将干净的git移至corrupt_git/.git
git status
中的{li} projects/corrupt_git
-确保其有效答案 16 :(得分:0)
在我的虚拟机崩溃并且 git 文件损坏后,我遇到了同样的问题。
第一步,从项目的根文件夹。
$ find .git/objects -type f -empty -delete
然后修剪和提取...
$ git prune
$ git fetch --all --prune
还有一些回滚,它开始工作了。
答案 17 :(得分:0)
将所有内容(在包含.git的文件夹中)复制到备份,然后删除所有内容并重新启动。确保你有git遥控器方便:
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
然后手动合并任何新文件,并尝试打开计算机。
答案 18 :(得分:0)
我偶尔会遇到这个问题,这是由于git操作期间的计算机或VM操作问题引起的。
对我来说最好的解决方案是删除git对象和所有相关的ref git文件:
sudo rm -r .git / objects / * .git / refs / heads / * .git / refs / remotes / * .git / refs / stash .git / refs / tags / *
然后拉回购:
git pull
这以最简单的方式为我解决了所有问题,而无需冒我的源代码或再次克隆存储库的风险。
答案 19 :(得分:0)
实际上我有同样的问题。 尝试之前,请先获得代码副本。
我刚刚做了
git reset HEAD~
我的上一次提交被撤消 然后我再次提交,问题解决了!
答案 20 :(得分:0)
我也经常发生这种情况。确切情况下尚未制定协议,但是我怀疑只要我的虚拟机“意外地”存在,它就会发生。如果关闭VM窗口(我正在使用Ubuntu 18.04)并再次启动,则一切总是正常(?)。但是,如果关闭笔记本电脑(Windows主机系统)后,VM窗口仍处于打开状态,那么我会经常遇到此问题。
关于此处给出的所有答案:
谢谢-它们非常有用;我通常会保存代码的本地副本,从远程还原存储库,然后将备份副本移回本地文件夹。
由于根本的问题实际上不是git问题,而是VM和/或Linux问题,我想知道是否应该有办法解决症状而不是解决问题?这种错误是否表示某些文件系统更改在任何合理的时间内没有“应用”,而是仅被缓存了? (例如,参见https://unix.stackexchange.com/questions/464184/are-file-edits-in-linux-directly-saved-into-disk)-对我来说,似乎虚拟Linux计算机没有足够频繁地同步其内容。这是Oracle的VirtualBox(否则效果很好)还是来宾文件系统的问题,还是我们都忽略的某些设置的问题,超出了我的专业知识。但是,如果有人可以阐明这一点,我会很高兴。
答案 21 :(得分:0)
从一个干净的分支中检出主人后出现同样的问题。 过了一会儿,我在master中识别了很多修改过的文件。从一个干净的分支切换后,我不知道他们为什么一直在那里。无论如何,因为修改后的文件对我来说毫无意义,我只是把它们藏起来,错误就消失了。
git:(master) git stash
答案 22 :(得分:0)
我修复了我的git错误:目标文件为空,原因是:
希望这会有所帮助。
答案 23 :(得分:0)
如果您在github.com上的公共仓库工作正常,但您的本地仓库已损坏,这是一种解决问题的方法。请注意,您将放弃在本地仓库中完成的所有提交。
好吧,所以我在本地有一个repo给了我object empty error
和github.com上的同一个repo,但是没有这个错误。所以我只是克隆了从github工作的repo,然后从corrupt repo(.git文件夹除外)中复制了所有内容,并将克隆的repo粘贴到正常工作中。
这可能不是一个实用的解决方案(因为您删除了本地提交),但是,您维护代码和修复版本控制。
在应用此方法之前,请记得备份。
答案 24 :(得分:0)
我和我的同事已经多次遇到同样的问题,为了解决这个问题,我们只需执行下面描述的步骤。它不是最优雅的解决方案,但它可以在不丢失数据的情况下运行。
old_project
)。git clone
在新目录中克隆存储库。old_project
内的所有文件和目录(.git
目录除外)复制到新创建的项目目录中。我希望它有所帮助...
答案 25 :(得分:0)
提交您的更改(如果有),然后只提交git reset --hard
答案 26 :(得分:0)
如果您有OLD备份并且匆忙:
为您当前的git-broken项目路径制作新的备份。
.git
移至垃圾箱(永不删除).git
git pull
(会产生合并冲突)./src
(永不删除)git gui
,推动......拍拍你的手!答案 27 :(得分:0)
上面介绍的十二步解决方案也帮助我摆脱了困境。谢谢。关键步骤是进入:
git fsck --full
并删除所有空对象
rm .git/objects/...
然后得到鞭子的两行:
tail -n 2 .git/logs/refs/heads/master
返回值
git update-ref HEAD ...
此时我没有更多错误,所以我备份了我最近的文件。然后做一个git pull然后是git push。将我的备份复制到我的git存储库文件并执行另一个git push。这让我感到最新。
答案 28 :(得分:-4)
如果您不关心保留历史提交,请运行
rm -r .git
然后对有关删除写保护文件的任何问题回答“是”。 问题在一分钟内解决了。