Podmoduł Git pokazuje nowe zatwierdzenia, status podmodułu nie mówi nic do zatwierdzenia

47

W repozytorium git skonfigurowałem plik .gitmodules, aby odwoływał się do repozytorium github:

[submodule "src/repo"]
    path = src/repo
    url = repourl

kiedy „git status” w tym repozytorium pokazuje:

On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   src/repo (new commits)

Jeśli włożę cd do src / repo i status git na repo, to znaczy, że nie ma nic do zatwierdzenia.

Dlaczego moja najwyższa wersja repozytorium git narzeka?

Catherine Holloway
źródło

Odpowiedzi:

42

Jest tak, ponieważ rekordy Git, które zatwierdzają (nie gałąź ani znacznik, dokładnie jeden zatwierdzony reprezentowany w skrócie SHA-1) powinny zostać sprawdzone dla każdego podmodułu. Jeśli zmienisz coś w reżimie podmodułu, Git to wykryje i zachęci do zatwierdzenia tych zmian w repozytorium najwyższego poziomu.

Uruchom git diffw repozytorium najwyższego poziomu, aby pokazać, co tak naprawdę zmieniło myśli Git. Jeśli już dokonałeś zatwierdzeń w swoim podmodule (a więc „wyczyść” w podmodule), zgłasza zmianę skrótu podmodułu.

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

W przeciwnym razie pokazuje -dirtyzmianę skrótu, której nie można wprowadzić ani zatwierdzić w repozytorium najwyższego poziomu. git statustwierdzi również, że podmoduł ma nieśledzoną / zmodyfikowaną zawartość.

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

    modified:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

Aby zaktualizować, które rekordy zatwierdzania powinny zostać sprawdzone dla podmodułu, oprócz zatwierdzenia zmian w podmodule należy dodatkowo zatwierdzić submoduł:

git add src/repo
yaegashi
źródło
1
Co jeśli nie chcę dodawać żadnych zatwierdzeń w głównym repozytorium? Mój przypadek użycia to - mam główne repozytorium, a następnie mam jego wiki, które jest również repozytorium (dostępne w GitHub i Bitbucket). Teraz dodałem wikijako podmoduł w katalogu wiki . Nie chcę, aby jakiekolwiek moje zmiany z wiki(tj. Katalogu wiki ) znalazły odzwierciedlenie w moim głównym repozytorium / code. Czy powinienem po prostu dodać .gitmodules ścieżkę do mojego .gitignoregłównego repozytorium? Jak mam to zrobić?
yadav_vi
14
W moim przypadku wszystko, co musiałem zrobić, to zaktualizować sam submoduł z głównego repozytorium. Coś w stylu:git submodule update src/repo
Agustín Amenabar,
19

Właśnie natrafiłem na tę samą klasę problemu i mogłem skorzystać z rozwiązania oferowanego przez @AugustinAmenabar w sekcji komentarzy w zaakceptowanej odpowiedzi. Moja konfiguracja była nieco bardziej złożona, więc dodałem --recursiveflagę, aby zaktualizować wszystkie zależności.

git submodule update src/repo --recursive

Zak
źródło