Как я могу переместить один каталог из репозитория git в новый, сохранив историю?
-
03-07-2019 - |
Вопрос
Я унаследовал git-репозиторий, содержащий несколько проектов в отдельных каталогах. Я хотел бы разделить репозиторий на новые отдельные репозитории, по одному для каждого проекта, а затем сделать основной репозиторий, содержащий проекты в виде подмодулей. Я хотел бы сделать все это, сохранив историю изменений отдельных проектов, если это возможно.
Я мог бы клонировать репозиторий для каждого проекта и каждый раз удалять все другие проекты, но есть ли лучший способ избежать клонированной истории в каждом новом репозитории проекта?
Решение
Вы можете использовать ветку git filter
переписать историю проекта. Из документации:
Переписать репозиторий, чтобы он выглядел как если foodir / был корнем проекта, и откажитесь от всей другой истории:
git filter-branch --subdirectory-filter foodir -- --all
Сделайте несколько копий репо, сделайте это для каждого подкаталога, который вы хотите выделить, и вы должны получить то, что ищете.
Другие советы
Чтобы экспортировать папку как новый репозиторий, вам нужно:
<Ол>Откройте клонированную папку репозитория и выполните эту команду:
git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
Суть git в том, что история включается в каждый коммит путем хеширования родительского коммита. Вы могли бы "повторить" коммиты (именно так работает svn-импортер) в новый репозиторий с сохранением только каждого подпроекта. Это, однако, разрушило бы значение хэшей коммитов. Если у вас нет проблем с этим, пусть будет так.
В прошлом я просто клонировал его и пошел дальше. Это делает вещи больше, но дисковое пространство дешевое; мое время дорого.
Я также не знаю каких-либо инструментов для склейки каталога. Я полагаю, что вы можете выполнить git-log в каталоге, чтобы найти все коммиты в нем, а затем воспроизвести коммиты с помощью чего-то вроде git-fast-export?