git tree包含重复的文件条目

时间:2012-06-07 12:38:40

标签: git duplicates

我遇到了一些关于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'

我尝试过重新包装和垃圾收集。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:6)

我过去曾使用git-replace和git-mktree来解决这个问题。您基本上保留了损坏的树对象,但覆盖所有链接并使它们指向一个新对象。

  1. 首先我们抓住了坏​​树: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,·& →是空白[空格]和[标签]

  2. 接下来,编辑文本,删除有问题的行,并使用Unix样式结尾保存(即只保存LF,而不是CRLF)。在这个例子中,我们做到了:

    040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb →  EXT
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e →  duplicateFolder
    040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 →  ToolTester
    040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 →  xNotAlphabetic
    
  3. 键入cat tmpfile.txt | git mktree,它将创建一个新的固定树对象并保存它,并返回新的哈希: a55115e4a05ea9ac8b79e37b872024d64d4r2c2e a.k.a.用于演示目的new_tree_hash

  4. 下一个git replace将创建一个新引用,它会强制所有先前发生的链接使用新的固定对象。 git replace bad_tree_hash new_tree_hash

  5. 这将解决您当前的问题。如果您有兴趣,请查看.git/refs/replace文件夹中的重写链接。


    每当您使用git fsck检查存储库时,错误的树对象将继续生成警告,但可以忽略它,并且所有提交和其他链接都将保持一致并且无论如何都可以。

答案 1 :(得分:4)

我最后通过执行以下操作修复了回购

  1. 从github做一个新的克隆,只包含问题发生之前的提交
  2. 从文件系统中添加我搞砸了的repo作为新克隆上的遥控器
  3. 煞费苦心地检查从坏回购中提交到新克隆的工作副本

    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
    
  4. 依次提交每个,手动复制来自其他repo的提交消息
  5. 从遥控器中删除损坏的回购
  6. 垃圾收集+修剪

    git gc --aggressive --prune=now
    
  7. 因为git fsck没有显示重复的文件条目而高兴地哭泣

答案 2 :(得分:1)

在有问题的提交之前签出新分支。现在签出有问题的提交中的文件。现在使用相同的消息添加和提交它们(使用-C选项)。重复其余的提交。完成后,重置另一个分支以指向正确的分支。然后你可以推。

答案 3 :(得分:1)

我遇到了这个问题,这里和其他SO线程中的所有解决方案都无法为我解决。最后我使用BFG repo cleaner来销毁所有引用错误文件夹名称的提交,这可能是过度杀伤但成功修复了回购。

答案 4 :(得分:0)

再次重新提交您的提交可能会解决它。如果这没有用,那么你可以使用git低级命令(git-cat-file)来查看哪些提交包含这个奇怪的树对象,并重新构建一个没有重复项的树的正确版本。但是,我不知道任何可以解决此问题的自动工具,您可能必须更改已经链接到奇怪的所有树和提交对象。

顺便说一句,git ls-tree ee2060应该显示有关受损树中数据的更多详细信息,例如那里引用的文件。