Comment gérer les référentiels dans les référentiels a été une question en cours avec git. Les sous - modules de Git sont un moyen de résoudre la situation, au détriment de l'ajout d'un peu plus de complexité à suivre. Le site git propose une introduction aux sous-modules .
L'idée de base est de conserver une référence à un autre référentiel git associé à un chemin sur votre référentiel. Ces références sont stockées dans un fichier .gitmodules
à la racine de votre référentiel (qui est géré par git, alors laissez-le tranquille). Une partie de la complexité entre en jeu lors du clonage d'un référentiel qui a des sous-modules: vous devez explicitement git submodule init
créer le .gitmodules
fichier, puis git submodule update
cloner les sous-modules.
Voici une procédure pas à pas sur la façon dont je vais ajouter un nouveau plugin vim à mon référentiel dotfiles (j'ai un ~/.vim/
alias pour ce dépôt .vim/
) en utilisant un sous-module:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Après le submodule add
, un git status
montrerait que vous avez modifié (ou créé) le .gitmodules
fichier, avec quelque chose comme ceci:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Il devrait également apparaître .vim/bundle/vim-elixir
comme un nouveau fichier. Git traite ce chemin spécialement maintenant: c'est un répertoire normal sur votre système de fichiers (donc vim le charge normalement), mais git diff
le traitera comme un commit spécifique depuis son référentiel. Lorsque vous regardez les différences ou les journaux pour ce chemin (par exemple git log -1 -u .vim/bundle/vim-elixir
), git l'affichera comme une chaîne d'une ligne comme ceci:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
Mise à jour à la dernière version du plug - in correspond à de entrer dans le dépôt de sous - module et vérifier un commit, puis engageant que dans votre dépôt:
$ 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