git tree包含重复的文件条目

Chr*_*est 7 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.
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)

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

Ton*_*nyH 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
    
    Run Code Online (Sandbox Code Playgroud)

    NB,·&→是空格[空格]和[标签]

  2. 接下来,编辑文本,删除有问题的行,并使用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)
  3. 键入cat tmpfile.txt | git mktree将创建一个新的,固定的树对象并保存它,并返回新的哈希: a55115e4a05ea9ac8b79e37b872024d64d4r2c2eaka用于演示目的new_tree_hash

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

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


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


Chr*_*est 5

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

  1. 从 github 做一个新的克隆,它只包括在问题发生之前的提交
  2. 从文件系统添加我搞砸的 repo 作为新克隆上的遥控器
  3. 煞费苦心地检查从坏的 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)
  4. 依次提交,从另一个仓库手动复制提交消息
  5. 从遥控器中删除损坏的回购
  6. 垃圾收集 + 修剪

    git gc --aggressive --prune=now
    
    Run Code Online (Sandbox Code Playgroud)
  7. 高兴地哭泣,因为 git fsck 显示没有重复的文件条目