Я хотел бы разветвить огромный репозиторий (10 ГБ), отфильтровать его в определенный каталог и отправить отфильтрованную версию в новый репозиторий Github.
Я использовал инструкции эти для извлечения и фильтрации в свой каталог, и это работает. Но когда я пытаюсь отправить отфильтрованный репозиторий обратно в Github, я получаю эту ошибку:
$ git push origin master --force
Enumerating objects: 2292154, done.
Counting objects: 100% (2292154/2292154), done.
Delta compression using up to 8 threads
Compressing objects: 100% (562030/562030), done.
error: RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32
fatal: the remote end hung up unexpectedly
Writing objects: 100% (2292154/2292154), 7.03 GiB | 40.92 MiB/s, done.
Total 2292154 (delta 1726549), reused 2292154 (delta 1726549)
fatal: the remote end hung up unexpectedly
Everything up-to-date
Я пробовал решение, предложенное здесь, но ошибка сохраняется.
Есть ли способ разветвить конкретный каталог и уменьшить общий размер репо, чтобы упростить его управление?
Учитывая приведенные вами ссылки, проблема может быть связана с размером коммита. Возможно, может помочь фильтрация вашего репо только в этом каталоге, но сохранение коммитов, связанных с ним.
Из git filter-branch
руководства:
To rewrite the repository to look as if foodir/ had been its project root, and discard all other history:
git filter-branch --subdirectory-filter foodir -- --all
Надеюсь, это поможет.
Оставить только этот каталог (и сохранить его в структуре) немного сложнее.
Судя по примеру из руководства git-filter-branch
, это должно сработать:
git filter-branch --index-filter \
'git ls-files -s foodir/ |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' -- --all
Вкратце: вывод git ls-files -s foodir/
показывает содержимое индекса (дерево больших двоичных объектов и имя файла) только для файлов в foodir/; этот список файлов помещается обратно в индекс.
В любом случае, как я заметил в комментарии, вы не сможете просто слить его, так как коммиты теперь другие.
Вы можете попробовать с git filter-branch --index-filter
. Извините за краткость, я подробно расскажу об этом, когда у меня будет больше времени. Обратите внимание, что git filter-branch перезаписывает историю, вы не сможете просто слить ее в исходный репозиторий.
Спасибо! это работает. Есть ли способ сделать это, сохраняя мой каталог в его текущем местоположении (вместо корня)? Это упростит позднее слияние с восходящим потоком.