Сегмент git проекта в подмодули
У меня есть проект git, который в настоящее время развивается, и несколько частей начинают становиться проектами сами по себе.
Итак, я хочу создать для них подмодули, но сохранить историю файлов. Были перемещения между различными папками (например, из partThatIsNotItsOwnProject
в partThatIsItsOwnProject
и я хотел бы иметь историю для этого шага тоже.)
До:
/.git
/someFiles
/partThatIsItsOwnProject
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory
Я хотел бы иметь:
/.git
/someFiles
/partThatIsItsOwnProject
--/.git
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory
Итак, я догадался git subtree
будет делать это, но он, похоже, сохраняет исходный репозиторий git и отображает только его часть. git submodule
кажется, цель этой настройки, но как мне сделать переход?
2 ответа
Для этого вам нужно переписать историю всего хранилища, чтобы исключить все, что не связано с каталогом, который вы хотите поместить в отдельное хранилище. git filter-branch
Команда полезна для этого. Вы можете найти пример скрипта, который делает это в [0]. Обратите внимание, что вам может потребоваться настроить его в соответствии с вашими потребностями.
В общем, git filter-branch
[1] позволяет вам переписывать историю мерзавцев, применяя ваши фильтры к каждому коммиту в репо последовательно. Обратите внимание, что хотя с использованием --tree-filter
Это самый простой способ достичь того, что вам нужно, он очень медленный, так как он выполняет правильную проверку каждого коммита на этом пути, поэтому редактирование индекса напрямую --index-filter
лучше.
[0] https://github.com/openstack/oslo.tools/blob/master/filter_git_history.sh
Создайте основной git, затем переименуйте разветвленный в partThatIsItsOwnProject, а затем удалите все, что не является частью этого "subdir". Затем добавьте раздвоенный git в качестве подмодуля в основной git, вся история будет сохранена.
Повторите эти действия для всех подкаталогов, которые вы хотели бы выделить из мастер-мерзавца.