作者:mobiledu2502891987 | 来源:互联网 | 2022-10-22 16:41
我们有一个很大的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哈希?
现在,我用谷歌搜索了问题,但是找不到解决该问题的方法。我发现一个看似不错的资源是:树包含重复的文件条目
但是,基本上可以归结为使用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
似乎只在提交时起作用,而忽略树替换...