Cómo tratar con repositorios dentro de repositorios ha sido una pregunta continua con git. Los submódulos de Git son una forma de abordar la situación, a expensas de agregar un poco más de complejidad para realizar un seguimiento. El sitio git tiene una introducción a los submódulos .
La idea básica es mantener una referencia a otro repositorio git asociado con una ruta en su repositorio. Estas referencias se almacenan en un archivo .gitmodules
en la raíz de su repositorio (que es administrado por git, así que déjelo en paz). Parte de la complejidad entra en juego al clonar un repositorio que tiene submódulos: debe git submodule init
crear explícitamente el .gitmodules
archivo y luego git submodule update
clonar los submódulos.
Aquí hay un tutorial sobre cómo agregaré un nuevo complemento vim a mi repositorio de archivos de puntos (me he ~/.vim/
alias a este repositorio .vim/
) usando un submódulo:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Después de esto submodule add
, a git status
mostrará que ha modificado (o creado) el .gitmodules
archivo, con algo como esto:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
También debería mostrarse .vim/bundle/vim-elixir
como un nuevo archivo. Git trata esa ruta especialmente ahora: es un directorio normal en su sistema de archivos (por lo que vim lo carga normalmente), pero git diff
lo tratará como una confirmación específica de su repositorio. Al mirar diffs o registros para esa ruta (por ejemplo git log -1 -u .vim/bundle/vim-elixir
), git lo mostrará como una cadena de una línea como esta:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
La actualización a la versión más reciente de los plugins corresponde a entrar en el repositorio del submódulo y la salida a una nueva confirmación, y luego cometer que a su repositorio:
$ 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