Come gestire i repository all'interno dei repository è stata una domanda in corso con Git. I sottomoduli di Git sono un modo per affrontare la situazione, a scapito di aggiungere un po 'più di complessità da tenere traccia. Il sito git ha un'introduzione ai sottomoduli .
L'idea di base è mantenere un riferimento a un altro repository git associato a un percorso sul proprio repository. Questi riferimenti sono memorizzati in un file .gitmodules
nella radice del tuo repository (che è gestito da Git, quindi lascialo in pace). Parte della complessità entra in gioco durante la clonazione di un repository che ha sottomoduli: è necessario esplicitamente git submodule init
creare il .gitmodules
file e quindi git submodule update
clonare i sottomoduli.
Ecco una procedura dettagliata di come aggiungerò un nuovo plug-in vim al mio repository dotfiles (ho creato un ~/.vim/
aliasing per questo repository .vim/
) usando un sottomodulo:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Dopo il submodule add
, a git status
mostrerebbe che hai modificato (o creato) il .gitmodules
file, con qualcosa del genere:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Dovrebbe anche essere mostrato .vim/bundle/vim-elixir
come nuovo file. Git tratta quel percorso specialmente ora: è una normale directory sul tuo file system (quindi vim lo carica normalmente), ma git diff
lo tratterà come un commit specifico dal suo repository. Quando si guardano i diff o i log per quel percorso (ad es. git log -1 -u .vim/bundle/vim-elixir
), Git lo mostrerà come una stringa di una riga come questa:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
L'aggiornamento all'ultima versione del plug-in corrisponde all'accesso al repository del sottomodulo e alla verifica di un nuovo commit, quindi al commit di quello nel repository:
$ 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