Wie man mit Repositories innerhalb von Repositories umgeht, war eine ständige Frage bei git. Gits Submodule sind eine Möglichkeit, die Situation zu bewältigen, auf Kosten von ein wenig mehr Komplexität, um den Überblick zu behalten. Die Git-Site enthält eine Einführung in Submodule .
Die Grundidee ist, einen Verweis auf ein anderes Git-Repository zu behalten, das einem Pfad in Ihrem Repository zugeordnet ist. Diese Referenzen werden in einer Datei .gitmodules
im Stammverzeichnis Ihres Repositorys gespeichert (das von git verwaltet wird, lassen Sie es also in Ruhe). Ein Teil der Komplexität spielt beim Klonen eines Repos mit Submodulen eine Rolle: Sie müssen git submodule init
die .gitmodules
Datei explizit erstellen und anschließend git submodule update
die Submodule klonen.
Hier ist eine exemplarische Vorgehensweise, wie ich meinem Dotfiles-Repository mithilfe eines Submoduls ein neues VIM-Plugin hinzufüge (ich habe ~/.vim/
mich auf dieses Repository verlagert .vim/
):
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Nachdem der submodule add
eine git status
würde zeigen , dass Sie (oder erstellt) die geändert haben .gitmodules
Datei, mit so etwas wie folgt aus :
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Es sollte auch .vim/bundle/vim-elixir
als neue Datei angezeigt werden. Git behandelt diesen Pfad jetzt speziell: Es ist ein normales Verzeichnis in Ihrem Dateisystem (also lädt vim es normal), git diff
behandelt es aber als ein bestimmtes Commit aus seinem Repository. Wenn Sie sich Diffs oder Logs für diesen Pfad ansehen (zB git log -1 -u .vim/bundle/vim-elixir
), zeigt git dies als einzeilige Zeichenkette an:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
Ein Update auf die neueste Version des Plug - Ins entspricht in das Submodul Repository zu gehen und eine neue begehen Check - out, und dann zu begehen , dass an Ihrem 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