Як поводитися з сховищами всередині репозиторіїв, що триває, залишається питанням з 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
трактує його як конкретну комісію зі свого сховища. Переглядаючи diff або log для цього шляху (наприклад 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