Zakładając, że repozytorium submodułu zawiera zatwierdzenie, którego chcesz użyć (w przeciwieństwie do zatwierdzenia, do którego odwołuje się bieżący stan superprojektu), istnieją dwa sposoby, aby to zrobić.
Pierwszy wymaga znajomości zatwierdzenia z podmodułu, którego chcesz użyć. Działa od „wewnątrz, na zewnątrz”, bezpośrednio dostosowując submoduł, a następnie aktualizując superprojekt. Drugi działa od „z zewnątrz”, znajdując zatwierdzenie super projektu, które zmodyfikowało podmoduł, a następnie resetuj indeks superprojektu, aby odnosił się do innego zatwierdzenia submodułu.
Na lewą stronę
Jeśli już wiesz, jakiego zatwierdzenia chcesz użyć cd
w tym podmodule, sprawdź w tym podmenu, którego chcesz, a następnie git add
i git commit
ponownie w super-projekcie.
Przykład:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Ups, ktoś wykonał zatwierdzenie super projektu, które odnosi się do niepublikowanego zatwierdzenia w podmodule sub
. Jakoś wiemy już, że chcemy, aby podmoduł był na zatwierdzeniu 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Idź tam i sprawdź to bezpośrednio.
Kasa w podmodule
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
Ponieważ sprawdzamy zatwierdzenie, powoduje to odłączenie HEAD w submodule. Jeśli chcesz się upewnić, że submoduł używa gałęzi, użyj git checkout -b newbranch <commit>
do utworzenia i pobrania gałęzi przy zatwierdzeniu lub wypłaty żądanej gałęzi (np. Takiej z żądanym zatwierdzeniem na końcu).
Zaktualizuj superprojekt
Kasa w podmodule znajduje odzwierciedlenie w superprojekcie jako zmiana w działającym drzewie. Musimy więc wprowadzić zmiany w indeksie superprojektu i zweryfikować wyniki.
$ git add sub
Sprawdź wyniki
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Aktualizacja submodułu była cicha, ponieważ submoduł jest już w określonym zatwierdzeniu. Pierwszy diff pokazuje, że indeks i drzewo robocze są takie same. Trzeci diff pokazuje, że jedyną zmianą etapową jest przeniesienie sub
submodułu do innego zatwierdzenia.
Popełnić
git commit
Zatwierdza to pozycję submodułu naprawionego.
Na zewnątrz, w
Jeśli nie jesteś pewien, którego zatwierdzenia powinieneś użyć z podmodułu, możesz przejrzeć historię w superprojekcie, aby cię poprowadzić. Możesz także zarządzać resetowaniem bezpośrednio z superprojektu.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
To ta sama sytuacja, co powyżej. Ale tym razem skupimy się na naprawieniu go z superprojektu zamiast zanurzaniu się w submodule.
Znajdź błędne zobowiązanie superprojektu
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK, wygląda na to, że poszło źle ce5d37c
, więc przywrócimy submoduł z jego elementu nadrzędnego ( ce5d37c~
).
Alternatywnie możesz pobrać zatwierdzenie podmodułu z tekstu poprawki ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) i zamiast tego użyć powyższego procesu „wewnątrz, na zewnątrz”.
Zamówienie w Super-projekcie
$ git checkout ce5d37c~ -- sub
Spowoduje to zresetowanie wpisu podmodułu sub
do tego, co było w zatwierdzeniu ce5d37c~
w superprojekcie.
Zaktualizuj podmoduł
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
Aktualizacja podmodułu poszła OK (wskazuje na odłączoną GŁOWĘ).
Sprawdź wyniki
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Pierwszy diff pokazuje, że sub
jest teraz taki sam w ce5d37c~
. Drugi plik różnic pokazuje, że indeks i drzewo robocze są takie same. Trzeci diff pokazuje, że jedyną zmianą etapową jest przeniesienie sub
submodułu do innego zatwierdzenia.
Popełnić
git commit
Zatwierdza to pozycję submodułu naprawionego.