我遇到了一些关于20次提交的线路结束问题,并且发生了一些奇怪的事情.现在git fsck显示:
Checking object directories 100% (256/256), done.
error in tree ee2060e71cb36d33be5ddc1fe9ca8d7dd0ab35cd: contains duplicate file entries
Checking objects: 100% (8633/8633), done.
Run Code Online (Sandbox Code Playgroud)
和git show ee2060显示:
File1.cs
File2.cs
File2.cs
File2.cs
File3.cs
Run Code Online (Sandbox Code Playgroud)
这阻止我推到我的遥控器.git push显示:
error: unpack failed: index-pack abnormal exit
To https://github.com/username/Project.git
! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'https://github.com/username/Project.git'
Run Code Online (Sandbox Code Playgroud)
我尝试过重新包装和垃圾收集.我该如何解决这个问题?
我过去使用git-replace和git-mktree来解决这个问题.您基本上保留了损坏的树对象,但覆盖所有链接并使它们指向新对象.
首先我们抓住坏树:git ls-tree bad_tree_hash > tmpfile.txt
这写出你的坏树.例如:
040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 ? xNotAlphabetic
040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb ? EXT
040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e ? duplicateFolder
040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e ? duplicateFolder
040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 ? ToolTester
040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e ? duplicateFolder
Run Code Online (Sandbox Code Playgroud)
NB,·&→是空格[空格]和[标签]
接下来,编辑文本,删除有问题的行,并使用Unix样式的结尾保存(即只有LF,而不是CRLF).通过这个例子,我们做到了这个:
040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb ? EXT
040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e ? duplicateFolder
040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 ? ToolTester
040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 ? xNotAlphabetic
Run Code Online (Sandbox Code Playgroud)键入cat tmpfile.txt | git mktree将创建一个新的,固定的树对象并保存它,并返回新的哈希:
a55115e4a05ea9ac8b79e37b872024d64d4r2c2eaka用于演示目的new_tree_hash
下一个git replace将创建一个新引用,它会强制所有先前发生的链接使用新的固定对象.
git replace bad_tree_hash new_tree_hash
这将解决您的直接问题.如果您有兴趣,请查看该.git/refs/replace文件夹中的重写链接.
每当您对存储库进行检查时,错误的树对象将继续生成警告git fsck,但可以忽略它,并且您的所有提交和其他链接将保持一致并且无论如何都可以正常工作.
我终于通过执行以下操作修复了回购
煞费苦心地检查从坏的 repo 到新克隆的工作副本的提交
git checkout fe3254FIRSTCOMMITAFTERORIGIN/MASTER/HEAD . // note the dot at the end
// without the dot, you move your head to the commit instead of the commit
// to the working copy, and seems to bring the corrupt object into your good clone
Run Code Online (Sandbox Code Playgroud)垃圾收集 + 修剪
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)