我遇到了一些关于20次提交的线路结束问题,并且发生了一些奇怪的事情。现在git fsck显示:
Checking object directories 100% (256/256), done.
error in tree ee2060e71cb36d33be5ddc1fe9ca8d7dd0ab35cd: contains duplicate file entries
Checking objects: 100% (8633/8633), done.
和git show ee2060显示:
File1.cs
File2.cs
File2.cs
File2.cs
File3.cs
这阻止我推到我的遥控器。 git push shows:
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'
我尝试过重新包装和垃圾收集。我该如何解决这个问题?
答案 0 :(得分:6)
我过去曾使用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
NB,·& →是空白[空格]和[标签]
接下来,编辑文本,删除有问题的行,并使用Unix样式结尾保存(即只保存LF,而不是CRLF)。在这个例子中,我们做到了:
040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb → EXT
040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder
040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 → ToolTester
040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 → xNotAlphabetic
键入cat tmpfile.txt | git mktree
,它将创建一个新的固定树对象并保存它,并返回新的哈希:
a55115e4a05ea9ac8b79e37b872024d64d4r2c2e
a.k.a.用于演示目的new_tree_hash
下一个git replace将创建一个新引用,它会强制所有先前发生的链接使用新的固定对象。
git replace bad_tree_hash new_tree_hash
这将解决您当前的问题。如果您有兴趣,请查看.git/refs/replace
文件夹中的重写链接。
每当您使用git fsck
检查存储库时,错误的树对象将继续生成警告,但可以忽略它,并且所有提交和其他链接都将保持一致并且无论如何都可以。
答案 1 :(得分:4)
我最后通过执行以下操作修复了回购
煞费苦心地检查从坏回购中提交到新克隆的工作副本
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
垃圾收集+修剪
git gc --aggressive --prune=now
答案 2 :(得分:1)
在有问题的提交之前签出新分支。现在签出有问题的提交中的文件。现在使用相同的消息添加和提交它们(使用-C
选项)。重复其余的提交。完成后,重置另一个分支以指向正确的分支。然后你可以推。
答案 3 :(得分:1)
我遇到了这个问题,这里和其他SO线程中的所有解决方案都无法为我解决。最后我使用BFG repo cleaner来销毁所有引用错误文件夹名称的提交,这可能是过度杀伤但成功修复了回购。
答案 4 :(得分:0)
再次重新提交您的提交可能会解决它。如果这没有用,那么你可以使用git低级命令(git-cat-file)来查看哪些提交包含这个奇怪的树对象,并重新构建一个没有重复项的树的正确版本。但是,我不知道任何可以解决此问题的自动工具,您可能必须更改已经链接到奇怪的所有树和提交对象。
顺便说一句,git ls-tree ee2060
应该显示有关受损树中数据的更多详细信息,例如那里引用的文件。