Como lidar com repositórios dentro de repositórios tem sido uma questão constante no git. Os submódulos do Git são uma maneira de lidar com a situação, às custas de adicionar um pouco mais de complexidade para acompanhar. O site git tem uma introdução aos submódulos .
A idéia básica é manter uma referência a outro repositório git associado a um caminho no seu repositório. Essas referências são armazenadas em um arquivo .gitmodules
na raiz do seu repositório (que é gerenciado pelo git, então deixe em paz). Parte da complexidade entra em cena ao clonar um repositório que possui submódulos: você deve git submodule init
criar explicitamente o .gitmodules
arquivo e, em seguida, git submodule update
clonar os submódulos.
Aqui está uma explicação de como vou adicionar um novo plug-in vim ao meu repositório dotfiles (eu tenho o ~/.vim/
alias deste repositório .vim/
) usando um submodulo:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Após o submodule add
, a git status
mostraria que você modificou (ou criou) o .gitmodules
arquivo, com algo como isto:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Também deve aparecer .vim/bundle/vim-elixir
como um novo arquivo. O Git trata esse caminho especialmente agora: é um diretório normal no seu sistema de arquivos (então o vim o carrega normalmente), mas git diff
o tratará como um commit específico em seu repositório. Ao olhar para diffs ou logs para esse caminho (por exemplo git log -1 -u .vim/bundle/vim-elixir
), o git mostrará como uma string de uma linha como esta:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
A atualização para a versão mais recente dos corresponde plug-in para entrar em repositório do sub-módulo e check-out um novo commit, e depois cometer que ao seu repositório:
$ 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