10

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

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'

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

4

5 回答 5

8
于 2012-07-21T00:29:28.243 回答
5

我终于通过执行以下操作修复了回购

  1. 从 github 做一个新的克隆,它只包括问题发生之前的提交
  2. 将文件系统中我搞砸的回购添加为新克隆上的远程
  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 没有显示重复的文件条目
于 2012-06-08T17:29:25.970 回答
2

我遇到了这类问题,这里和其他 SO 线程中的所有解决方案都无法为我解决。最后,我使用BFG 存储库清理器来销毁所有引用错误文件夹名称的提交,这可能有点矫枉过正,但成功地修复了存储库。

于 2016-05-25T10:28:11.317 回答
1

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

于 2012-06-08T12:19:37.283 回答
0

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

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

于 2012-06-07T12:50:04.300 回答