问题:
- 不小心在第一台电脑上执行了 git --amend 并将其推送到了 USB 设备
- 从 USB 设备中拉取到第二台电脑上
- 第二台电脑的代码库现在已经被损坏了
- 在第一台电脑上执行 git pull 时会产生合并冲突; 不确定这是否也是一个损坏状态(如果 --amend 是有问题的)
症状:
大多数命令:
fatal: your current branch appears to be broken
.git/refs/heads/master:
$ cat .git/refs/heads/master
.git/refs/heads/master文件内容:
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
$ git status
new file: ...
new file: ... [for every file in the repository; expected since on a corrupted branch]
我不确定是否应该归咎于 git --amend,因为它似乎有点无害。也许其他原因导致了问题。
如何修复?
修复这个问题是否简单到只需要从.git/logs/refs/heads/master中最新的好提交中获取哈希值并手动插入到.git/refs/heads/master中?如果可以,请问应该如何操作?
如果是这样,那么我应该销毁有问题的提交(以免以后会出现问题,例如使用git-repack或其他方法破坏文件)吗?
当我尝试运行less .git/logs/refs/heads/master
并从形式的最后一行取出第一个哈希值时......
...
[hash for HEAD~2] [hash for HEAD~1] [authorname] ...
[hash for HEAD~1] [hash for HEAD] [authorname] ...
^^^^^^^^^^^^^^^^^ (corrupted)
EOF
将其粘贴到.git/refs/heads/master文件中后,我现在卡住了...
$ git fsck
error: inflate: data stream error (unknown compression method)
error: unable to unpack header of .git/objects/8f/1da374ffac3711f8cdde57379f90cb03bbb9ea
error: 8f1da374ffac3711f8cdde57379f90cb03bbb9ea: object corrupt or missing: .git/objects/8f/1da374ffac3711f8cdde57379f90cb03bbb9ea
error: inflate: data stream error (unknown compression method)
error: unable to unpack header of .git/objects/ac/2fcd052804fb7adac465220da5bcb04d008fc7
error: ac2fcd052804fb7adac465220da5bcb04d008fc7: object corrupt or missing: .git/objects/ac/2fcd052804fb7adac465220da5bcb04d008fc7
Checking object directories: 100% (256/256), done.
Checking objects: 100% (1147/1147), done.
error: inflate: data stream error (unknown compression method)
error: unable to unpack 8f1da374ffac3711f8cdde57379f90cb03bbb9ea header
error: inflate: data stream error (unknown compression method)
error: unable to unpack 8f1da374ffac3711f8cdde57379f90cb03bbb9ea header
fatal: loose object 8f1da374ffac3711f8cdde57379f90cb03bbb9ea (stored in .git/objects/8f/1da374ffac3711f8cdde57379f90cb03bbb9ea) is corrupt
我可以尝试破坏松散的对象,但我不确定它是否反过来是更腐败对象(例如树)的指针,这些对象也必须被摧毁。如果我知道命令(或可以在备份上尝试rm),我当然可以尝试摧毁此对象;我应该尝试吗?
此外,我如何从这个混乱中修复USB密钥和其他仓库?谢谢。
(新手的潜在有用参考资料,不太可能帮助能够回答这个问题的人:https://aboullaite.me/deep-dive-into-git-git-refs/) (类似的问题fatal: your current branch appears to be broken —没有指定错误的原因;许多事情可能会导致此错误)
编辑:
我对上面列出的每个对象都进行了
rm .git/objects/...
,现在我有...$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (1147/1147), done.
error: refs/remotes/origin/HEAD: invalid sha1 pointer 0000000000000000000000000000000000000000
error: refs/remotes/origin/master: invalid sha1 pointer 0000000000000000000000000000000000000000
error: HEAD: invalid reflog entry 8f1da374ffac3711f8cdde57379f90cb03bbb9ea
error: refs/heads/master: invalid reflog entry 8f1da374ffac3711f8cdde57379f90cb03bbb9ea
error: bad ref for .git/logs/refs/remotes/origin/HEAD
error: bad ref for .git/logs/refs/remotes/origin/master
error: ac2fcd052804fb7adac465220da5bcb04d008fc7: invalid sha1 pointer in cache-tree
broken link from tree b0d598ef5427d59ed31eb1b315c761fc89af40b7
to tree ac2fcd052804fb7adac465220da5bcb04d008fc7
dangling blob f4e39c36cc8df3f9f324c0ccca4ed6a7a3ffe6ac
dangling tree 068716abcf815b4eaf8f0fe74c3020bf6251bba0
dangling blob fb4cfe7c94e8b4d800fdb4935806577b2b99fd94
dangling blob 35cf2ca2ed03811c14f1598c50daacfab9032b8f
missing tree ac2fcd052804fb7adac465220da5bcb04d008fc7
dangling blob d056e38af637cf0de76dac5689a8c5e735d75793
dangling blob 3b3903cc7b4eb035e9c4508024acc3f81c015741
dangling blob b09c3cc95935a327ecf7fad8374f14c4e320f67e
git fsck
命令,就可以保证未来不会出现问题(例如,通过fsck命令表示将来重新打包时不会因为孤立或损坏的对象而失败)? - ninjageckogit fsck
认为一切正常,那么它们应该是真的正常。历史上有一些问题git fsck
没有发现。(大多数都是相当小的问题,例如意外允许包含前导零的mode
字符串的树对象,这种情况从不太可能到系统崩溃/移除驱动器类型的损坏。)因此,不能完全保证,但非常可靠。 - torek