Как работать с репозиториями в репозиториях - постоянный вопрос с git. Подмодули Git - это один из способов решения ситуации за счет добавления немного большей сложности для отслеживания. Сайт git содержит введение в подмодули .
Основная идея состоит в том, чтобы сохранить ссылку на другой репозиторий git, связанный с путем в вашем репозитории. Эти ссылки хранятся в файле .gitmodules
в корне вашего хранилища (которым управляет git, поэтому оставьте его в покое). Некоторая сложность проявляется при клонировании репо с субмодулями: необходимо явно git submodule init
создать .gitmodules
файл, а затем git submodule update
клонировать субмодули.
Вот пошаговое руководство о том, как я добавлю новый плагин vim в мой репозиторий dotfiles (я использовал ~/.vim/
псевдоним этого репозитория .vim/
) с помощью подмодуля:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
После submodule add
, a git status
будет показывать, что вы изменили (или создали) .gitmodules
файл, примерно так:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Он также должен отображаться .vim/bundle/vim-elixir
как новый файл. Теперь Git обрабатывает этот путь специально: это обычный каталог в вашей файловой системе (поэтому vim загружает его нормально), но он git diff
будет обрабатывать его как определенный коммит из своего репозитория. При просмотре различий или журналов для этого пути (например git log -1 -u .vim/bundle/vim-elixir
), git покажет его в виде однострочной строки, например:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
Обновление до последней версии плагина соответствует входу в репозиторий подмодуля и проверке новой фиксации, а затем фиксации этого в вашем репозитории:
$ cd .vim/bundle/vim-elixir
$ git remote -v # note: the submodule repo's origin, not my repo's
origin https://github.com/elixir-lang/vim-elixir.git (fetch)
origin https://github.com/elixir-lang/vim-elixir.git (push)
$ git pull
# ...
$ cd - # back to my repository's root
$ git status
# ...
modified: .vim/bundle/vim-elixir (new commits)
$ git diff .vim/bundle/vim-elixir
# ...
-Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
+Subproject commit d59784e7afbd0d55c501e40c43b57cbe6f6e04c2
$ git commit -m "update vim-elixir" .vim/bundle/vim-elixir