Преобразовать папку git в подмодуль ретроспективно?

Довольно часто бывает, что вы пишете какой-то проект, и через некоторое время становится ясно, что какой-то компонент проекта действительно полезен как отдельный компонент (возможно, библиотека). Если у вас была эта идея с самого начала, тогда есть справедливая вероятность, что большая часть этого кода находится в ней собственной папке.

Есть ли способ конвертировать один из подкаталогов проекта git в подмодуль? В идеале это произойдет так, что весь код в этом каталоге будет удален из родительского проекта, а проект субмодуля будет добавлен в него, со всей соответствующей историей и таким образом, чтобы весь родительский проект зафиксировал правильность субмодуля..

Ответ 1

Чтобы изолировать подкаталог в своем собственном репозитории, используйте filter-branch в клоне исходного репозитория:

git clone <your_project> <your_submodule>
cd <your_submodule>
git filter-branch --subdirectory-filter 'path/to/your/submodule' --prune-empty -- --all

Тогда это не более чем удаление исходного каталога и добавление подмодуля в ваш родительский проект.

Ответ 2

Сначала измените каталог в папку, которая будет подмодулем. Тогда:

git init
git remote add origin repourl
git add .
git commit -am'first commit in submodule'
git push -u origin master
cd ..
rm -rf folder wich will be a submodule
git commit -am'deleting folder'
git submodule add repourl folder wich will be a submodule
git commit -am'adding submodule'

Ответ 3

Это можно сделать, но это не просто. Если вы ищете git filter-branch, subdirectory и submodule, в процессе есть приличные записи. Это по существу предполагает создание двух клонов вашего проекта, используя git filter-branch для удаления всего, кроме одного подкаталога в одном, и удаления только этого подкаталога в другом. Затем вы можете установить второй репозиторий как подмодуль первого.

Ответ 4

Я знаю, что это старый поток, но ответы здесь сквовают любые связанные коммиты в других ветвях.

Простой способ клонирования и сохранения всех этих дополнительных ветвей и коммитов:

1 - Убедитесь, что у вас есть этот псевдоним git

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2 - клонируйте пульт, потяните все ветки, измените пульт, отфильтруйте свою директорию, нажмите

git clone [email protected]:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin [email protected]:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags