У нас есть большой репозиторий 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 не выдавал ошибок, верно?Я знаю, что мне нужно будет переписать всю историю после испорченных коммитов.Я даже не мог найти способ получить коммит, который указывает на конкретные деревья, иначе я мог бы использовать перебазирование и исправление поврежденного коммита или чего-то еще.Любая помощь будет принята с благодарностью!
ОБНОВЛЕНИЕ: Я уверен, что я знаю , что делать, но пока не , как сделать:
- Создание нового объекта дерева из старого дерева, но с исправлением с помощью
git mktree
<- done </li> - Создание нового коммита, идентичного старому, который ссылается на плохое дерево, но с новым фиксированным деревом <- сложно, я не могу легко получить коммит в дерево, моё текущее решение запускается как час или больше, и я не знаю, как создать модифицированный коммит, как только я его найду </li>
- Выполнить
git filter-branch -- --all
<- Должны сохраняться замены коммитов </li>
К сожалению, я не могу просто использовать git replace --edit
на плохом дереве и затем запустить git filter-branch -- --all
, потому что filter-branch
, кажется, работает только на коммитах, но игнорирует дерево-replaces ...