Преобразовать папку 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