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


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

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

4 84

4 ответа:

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

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

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

сначала измените dir на папку, которая будет подмодулем. Затем:

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'

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

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

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 git@github.com:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin git@github.com:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags

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