我们有一个很大的 git 存储库,我想将其推送到一个自托管的 gitlab 实例。
问题是 gitlab 远程不允许我推送我的存储库:
git push --mirror https://mygitlab/xy/myrepo.git
这会给我这个错误:
Enumerating objects: 1383567, done.
Counting objects: 100% (1383567/1383567), done.
Delta compression using up to 8 threads
Compressing objects: 100% (207614/207614), done.
remote: error: object c05ac7f76dcd3e8fb3b7faf7aab9b7a855647867:
duplicateEntries: contains duplicate file entries
remote: fatal: fsck error in packed object
所以我做了一个 git fsck:
error in tree c05ac7f76dcd3e8fb3b7faf7aab9b7a855647867: duplicateEntries: contains duplicate file entries
error in tree 0d7286cedf43c65e1ce9f69b74baaf0ca2b73e2b: duplicateEntries: contains duplicate file entries
error in tree 7f14e6474400417d11dfd5eba89b8370c67aad3a: duplicateEntries: contains duplicate file entries
接下来我做的是检查git ls-tree c05ac7f76dcd3e8fb3b7faf7aab9b7a855647867
:
100644 blob c233c88b192acfc20548d9d9f0c81c48c6a05a66 fileA.cs
100644 blob 5d6096cb75d27780cdf6da8a3b4d357515f004e0 fileB.cs
100644 blob 5d6096cb75d27780cdf6da8a3b4d357515f004e0 fileB.cs
100644 blob d2a4248bcda39c0dc3827b495f7751b7cc06c816 fileC.xaml
请注意fileB.cs
显示两次,具有相同的哈希值。我认为这就是问题所在,因为为什么该文件会在同一棵树中出现两次,并且具有相同的文件名和 blob 哈希值?
现在我用谷歌搜索了这个问题,但找不到解决这个问题的方法。
我发现的一个看似不错的资源是:树包含重复的文件条目 https://stackoverflow.com/questions/13178720/tree-contains-duplicate-file-entries/24868719#24868719
然而,它基本上归结为使用 git Replace 并不能真正解决问题,因此 git fsck 仍然会打印错误并阻止我推送到远程。
然后有一个似乎完全删除了该文件(但我仍然需要该文件,但在树中只需要一次,而不是两次):https://stackoverflow.com/a/44672692/826244 https://stackoverflow.com/a/44672692/826244
还有其他方法可以解决这个问题吗?我的意思是确实应该可以修复,以便 git fsck 不会抛出任何错误,对吧?我知道在损坏的提交之后我需要重写整个历史记录。我什至找不到一种方法来获取指向特定树的提交,否则我可能可以使用变基并修补损坏的提交或其他东西。任何帮助将不胜感激!
更新:
我很确定我知道what要做,但还没有how去做吧:
- 从旧树创建一个新的树对象,但更正为
git mktree
- 创建一个与引用坏树的旧提交相同的新提交,但使用新修复的树
- Run
git filter-branch -- --all
可悲的是我不能只使用git replace --edit
到坏树上然后跑git filter-branch -- --all
因为filter-branch
似乎只适用于提交,但忽略树替换......