Как работать с репозиториями в репозиториях - постоянный вопрос с 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