Преобразовать папку, чтобы git подмодуля ретроспективно?
довольно часто бывает так, что вы пишете какой-то проект, и через некоторое время становится ясно, что какой-то компонент проекта на самом деле полезен как отдельный компонент (библиотека, возможно). Если у вас была эта идея с самого начала, то есть шанс, что большая часть этого кода в его собственной папке.
есть ли способ преобразовать один из подкаталогов проекта git в подмодуль? В идеале это произойдет так, что весь код в этом каталог удаляется из родительского проекта, и проект подмодуля добавляется на свое место, со всей соответствующей историей, и таким образом, что все фиксации родительского проекта указывают на правильные фиксации подмодуля.
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
чтобы удалить все, кроме одного подкаталога в одном, и удаление только этого подкаталога в другом. Затем вы можете установить второй репозиторий в качестве подмодуля первого.