Szukaj…
Dodanie submodułu
Możesz dołączyć inne repozytorium Git jako folder w swoim projekcie, śledzony przez Git:
$ git submodule add https://github.com/jquery/jquery.git
Powinieneś dodać i zatwierdzić nowy plik .gitmodules ; informuje to Git, które podmoduły powinny zostać sklonowane po uruchomieniu git submodule update .
Klonowanie repozytorium Git z podmodułami
Po sklonowaniu repozytorium, które korzysta z submodułów, musisz je zainicjować i zaktualizować.
$ git clone --recursive https://github.com/username/repo.git
Spowoduje to sklonowanie podmodułów, do których istnieją odniesienia, i umieszczenie ich w odpowiednich folderach (w tym podmodułach w ramach podmodułów). Jest to równoważne z uruchomieniem git submodule update --init --recursive natychmiast po zakończeniu klonowania.
Aktualizacja podmodułu
Podmoduł odwołuje się do konkretnego zatwierdzenia w innym repozytorium. Aby sprawdzić dokładny stan, do którego odnoszą się wszystkie podmoduły, uruchom
git submodule update --recursive
Czasami zamiast używać stanu, do którego się odwołujesz, chcesz zaktualizować do lokalnej kasy do najnowszego stanu tego podmodułu na pilocie. Aby sprawdzić wszystkie podmoduły do najnowszego stanu na pilocie za pomocą jednego polecenia, możesz użyć
git submodule foreach git pull <remote> <branch>
lub użyj domyślnych argumentów git pull
git submodule foreach git pull
Pamiętaj, że spowoduje to jedynie aktualizację lokalnej kopii roboczej. Uruchomienie git status spowoduje wyświetlenie katalogu podmodułu jako brudnego, jeśli zmienił się z powodu tego polecenia. Aby zamiast tego zaktualizować repozytorium, aby odwoływało się do nowego stanu, musisz zatwierdzić zmiany:
git add <submodule_directory>
git commit
Mogą wystąpić pewne zmiany, które mogą powodować konflikt scalania, jeśli używasz git pull więc możesz użyć git pull --rebase aby przewinąć zmiany do góry, przez większość czasu zmniejsza to prawdopodobieństwo konfliktu. Również przyciąga wszystkie gałęzie do lokalnych.
git submodule foreach git pull --rebase
Aby sprawdzić najnowszy stan określonego submodułu, możesz użyć:
git submodule update --remote <submodule_directory>
Ustawienie submodułu, aby podążał za gałęzią
Podmoduł jest zawsze sprawdzany w określonym zatwierdzeniu SHA1 („gitlink”, specjalny wpis w indeksie repozytorium nadrzędnego)
Można jednak poprosić o aktualizację tego submodułu do najnowszego zatwierdzenia gałęzi zdalnego repozytorium submodułu.
Zamiast wchodzić do każdego podmodułu, wykonując git checkout abranch --track origin/abranch, git pull , możesz po prostu zrobić (z repozytorium nadrzędnego):
git submodule update --remote --recursive
Ponieważ SHA1 podmodułu zmieniłby się, nadal musisz postępować zgodnie z:
git add .
git commit -m "update submodules"
To zakłada, że submoduły to:
albo dodany z odgałęzieniem do naśladowania:
git submodule -b abranch -- /url/of/submodule/repolub skonfigurowane (dla istniejącego podmodułu), aby podążało za gałęzią:
cd /path/to/parent/repo git config -f .gitmodules submodule.asubmodule.branch abranch
Usuwanie submodułu
Możesz usunąć submoduł (np. the_submodule ), wywołując:
$ git submodule deinit the_submodule
$ git rm the_submodule
git submodule deinit the_submoduleusuwathe_submodulez .git / config. Wyklucza togit submodule updategit submodule syncigit submodule foreachwywołaniami i usuwa jego zawartość lokalną (źródło) . Nie będzie to również wyświetlane jako zmiana w repozytorium nadrzędnym.git submodule initigit submodule updateprzywrócą submoduł, ponownie bez zmian w repozytorium nadrzędnym.git rm the_submoduleusunie submoduł z drzewa roboczego. Pliki znikną, podobnie jak wpis submodułów w pliku.gitmodules(źródło) . Jeśli tylkogit rm the_submodule(bez wcześniejszegogit rm the_submodulegit submodule deinit the_submodulezostanie uruchomiony,git submodule deinit the_submodulejednak wpis submodułów w pliku .git / config.
Zaczerpnięte stąd :
- Usuń odpowiednią sekcję z pliku
.gitmodules. - Etap zmiany
.gitmodulesgit add .gitmodules - Usuń odpowiednią sekcję z
.git/config. - Uruchom
git rm --cached path_to_submodule(bez końcowego ukośnika). - Uruchom polecenie
rm -rf .git/modules/path_to_submodule - Zatwierdź
git commit -m "Removed submodule <name>" - Usuń nieśledzone pliki submodułów
-
rm -rf path_to_submodule
Przenoszenie submodułu
Biegać:
$ git mv old/path/to/module new/path/to/module Edytuj
.gitmodulesi odpowiednio zmień ścieżkę submodułu i umieść go w indeksie za pomocągit add .gitmodules.W razie potrzeby utwórz katalog nadrzędny nowej lokalizacji submodułu (
mkdir -p new/path/to).Przenieś całą zawartość ze starego do nowego katalogu (
mv -vi old/path/to/module new/path/to/submodule).Upewnij się, że Git śledzi ten katalog (
git add new/path /to).Usuń stary katalog za pomocą
git rm --cached old/path/to/module.Przenieś katalog
.git/modules/ old/path/to/modulez całą zawartością do.git/modules/ new/path/to/module.Edytuj plik
.git/modules/ new/path/to /config, upewnij się, że element worktree wskazuje nowe lokalizacje, więc w tym przykładzie powinien to byćworktree = ../../../../../ old/path/to/module. Zwykle nie powinno być dwa więcej..następnie katalogi w bezpośredniej ścieżki w tym miejscu. . Zmodyfikuj pliknew/path/to/module /.git, upewnij się, że ścieżka w nim wskazuje poprawną nową lokalizację w folderze.gitgłównego projektu, więc w tym przykładziegitdir: ../../../.git/modules/ new/path/to/module.Wyjście
git statuswygląda następująco:# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: old/path/to/submodule -> new/path/to/submodule #Na koniec zatwierdz zmiany.
Ten przykład z Stack Overflow autorstwa Axela Beckerta