Git-Submodul zeigt neue Festschreibungen an, Submodulstatus sagt nichts aus, um festzuschreiben

47

In einem Git-Repository habe ich meine .gitmodules-Datei so eingerichtet, dass sie auf ein Github-Repository verweist:

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

Wenn ich in diesem Repo den Status "git" habe, wird Folgendes angezeigt:

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)

Wenn ich beim Repo in den Status src / repo und git wechsle, heißt es, dass es nichts zu übergeben gibt.

Warum beschwert sich mein Top-Level-Git-Repo?

Catherine Holloway
quelle

Antworten:

42

Das liegt daran, dass Git-Datensätze, die festgeschrieben werden (kein Zweig oder Tag, genau ein Festschreiben, das in SHA-1-Hash dargestellt wird), für jedes Submodul ausgecheckt werden sollten. Wenn Sie etwas in Submodul-Verzeichnis ändern, erkennt Git es und fordert Sie auf, diese Änderungen im Repository der obersten Ebene festzuschreiben.

Führen Sie git diffdas Repository der obersten Ebene aus, um zu zeigen, was Git tatsächlich denkt. Wenn Sie in Ihrem Submodul bereits einige Commits vorgenommen haben (also im Submodul "bereinigen"), wird die Hash-Änderung des Submoduls gemeldet.

$ 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

Andernfalls wird eine -dirtyHash-Änderung angezeigt, die Sie im Repository der obersten Ebene nicht bereitstellen oder festschreiben können. git statusDas Claims-Submodul hat auch nicht verfolgten / geänderten Inhalt.

$ 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")

Um zu aktualisieren, welche Festschreibungsdatensätze für das Submodul ausgecheckt werden sollen, müssen Sie zusätzlich zum Festschreiben der Änderungen im Submodul das Submodul festschreiben:

git add src/repo
yaegashi
quelle
1
Was ist, wenn ich im Haupt-Repo keine Commits hinzufügen möchte? Mein Anwendungsfall ist - ich habe ein Haupt-Repository, dann habe ich sein Wiki, das auch ein Repository ist (wie in GitHub und Bitbucket verfügbar). Jetzt habe ich das wikials Submodul in ein Verzeichnis- Wiki aufgenommen . Ich möchte nicht, dass meine Änderungen aus dem wiki(dh dem Wiki- Verzeichnis) in meinem Haupt- / Code-Repository übernommen werden. Sollte ich nur den .gitmodules Pfad in meinem .gitignoreHaupt-Repository hinzufügen ? Wie soll ich vorgehen?
yadav_vi
14
In meinem Fall musste ich nur das Submodul selbst vom Haupt-Repo aus aktualisieren. So etwas wie:git submodule update src/repo
Amenabar
19

Ich bin gerade auf dieselbe Problemklasse gestoßen und konnte die von @AugustinAmenabar im Kommentarbereich der akzeptierten Antwort angebotene Lösung verwenden . Mein Setup war etwas komplexer, daher habe ich das --recursiveFlag hinzugefügt , um alle Abhängigkeiten auf den neuesten Stand zu bringen.

git submodule update src/repo --recursive

Zak
quelle