Jak radzić sobie z repozytoriami w ramach repozytoriów było stałym pytaniem w git. GIT za Submoduły są jednym ze sposobów rozwiązania tej sytuacji, kosztem dodając trochę więcej złożoność śledzić. Witryna git zawiera wprowadzenie do podmodułów .
Podstawową ideą jest zachowanie odniesienia do innego repozytorium git powiązanego ze ścieżką w repozytorium. Odnośniki te są przechowywane w pliku .gitmodules
w katalogu głównym repozytorium (którym zarządza git, więc zostaw je w spokoju). Część złożoności pojawia się podczas klonowania repozytorium, które zawiera submoduły: musisz jawnie git submodule init
utworzyć .gitmodules
plik, a następnie git submodule update
sklonować submoduły.
Oto przewodnik, w jaki sposób dodam nową wtyczkę vim do mojego repozytorium dotfiles ( ~/.vim/
alias do tego repozytorium .vim/
) za pomocą submodułu:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Po submodule add
, a git status
pokaże, że zmodyfikowałeś (lub utworzyłeś) .gitmodules
plik za pomocą czegoś takiego:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Powinien również zostać pokazany .vim/bundle/vim-elixir
jako nowy plik. Git traktuje teraz tę ścieżkę specjalnie: jest to normalny katalog w systemie plików (więc vim ładuje go normalnie), ale git diff
traktuje go jako specyficzne zatwierdzenie z repozytorium. Kiedy patrzysz na diffs lub logi dla tej ścieżki (np. git log -1 -u .vim/bundle/vim-elixir
), Git pokaże ją jako ciąg jednowierszowy taki jak ten:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
Aktualizacja do najnowszej wersji wtyczki odpowiada wchodząc do repozytorium modułem i sprawdzeniu nowego popełnienia, a następnie popełnienia że do repozytorium:
$ 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