【发布时间】:2019-05-28 14:06:38
【问题描述】:
我们有一个大的 git 存储库,我想将它推送到一个自托管的 gitlab 实例。
问题是 gitlab 远程不允许我推送我的 repo:
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 哈希?
现在我用谷歌搜索了这个问题,但找不到解决这个问题的方法。 我发现的一个看似不错的资源是:Tree contains duplicate file entries
但是,它基本上归结为使用 git replace 并不能真正解决问题,因此 git fsck 仍然会打印错误并阻止我推送到远程。
然后有一个似乎完全删除了文件(但我仍然需要该文件,但在树中只需要一次,而不是两次):https://stackoverflow.com/a/44672692/826244
还有其他方法可以解决这个问题吗?我的意思是确实应该可以修复,以便 git fsck 不会抛出任何错误,对吗?我知道在损坏的提交之后我需要重写整个历史记录。我什至找不到一种方法来获取指向特定树的提交,否则我可以使用 rebase 并修补损坏的提交或其他东西。任何帮助将不胜感激!
更新: 我很确定我知道做什么,但还不知道怎么做:
- 从旧树创建一个新树对象,但用
git mktree更正 - 创建一个新的提交,它与引用坏树但使用新修复的树的旧提交相同不知道如何创建修改后的提交,一旦我找到它
- 运行
git filter-branch -- --all
遗憾的是,我不能只在坏树上使用git replace --edit,然后运行git filter-branch -- --all,因为filter-branch 似乎只适用于提交,但忽略了树替换...
【问题讨论】:
-
您的(客户端)和 GitLab 端(服务器,除非自托管也意味着自托管在同一台计算机上)有什么操作系统和 Git 版本?
-
Windows 上的 git 版本 2.21.0,Linux 上的 gitlab 11.9,不确定是哪一个。但是这个问题在 windows 和 linux 上是可以重现的,用
git clone --mirror检出,然后运行git fsck -
显然,存储库本身已损坏。
-
是的,如果可能的话,我想解决这个问题
-
我在你的回答中没有看到stackoverflow.com/a/24868719/6309 中提到的
git show <bad_tree>:这至少会显示重复的条目。