Как сделать часть существующего репозитория GIT подмодулем
-
22-09-2019 - |
Вопрос
У меня есть репозиторий git, который содержит две папки: binary-search
и poker
.Например, http://github.com/soulnafein/code-katas
Я хотел бы превратить эти папки в подмодули и сохранить историю их изменений.
Как мне это сделать?
Решение
Общая идея состоит в том, чтобы использовать 'git-ветвь фильтра' и следующие шаги:
1) Создайте подмодуль, используя --subdirectory-filter filter-branch
(после клонирования вашего репо).
$ git filter-branch --subdirectory-filter ABC HEAD -- --all
Видеть это ТАК вопрос подробнее об этом шаге.
2) Создайте суперпроект, используя индексный фильтр filter-branch
удалить подмодуль.
$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD
3) Прикрепите подмодуль к последней версии суперпроекта.
Видеть Отключить подкаталог в отдельный репозиторий git. для практического примера.
Каждый субмодуль сохранит свою историю.
Но как сказано в этом предложение патча, это будет:
потерять все исторические связи между суперпроектом и подмодулем, сломав такие инструменты, как '
git bisect
', что затрудняет восстановление старых выпусков.В идеале каждая версия вновь созданного суперпроекта должна быть связана с правильной версией подмодуля (и все записи .gitmodules также будут настроены правильно на протяжении всей истории проекта).
Если вам не нужно связывать предыдущую историю с новыми подмодулями, вы можете выполнить шаги, упомянутые выше.
Но если вам действительно нужно перейти от более старой точки, имея ссылки на ваши подмодули (которые в настоящее время являются простыми подкаталогами), вы можете попробовать сценарий, упомянутый в патче, о котором я говорю.Это обсуждается в эта тема, но еще интегрирован в Git, как говорит Джунио С. Хамано:
К сожалению, я не думаю, что мы полностью разработали (и вообще не реализовали) поведение для проверки различных точек истории, в которых один и тот же подмодуль перемещался по дереву суперпроекта.
Другие советы
Сегодня есть лучший способ сделать это: git subtree
Видеть этот ответ.