Wie in Mark Longairs Blog-Beitrag Git Submodules Explained erwähnt ,
Die Versionen 1.7.0 und höher von git enthalten eine ärgerliche Änderung im Verhalten des Git-Submoduls.
Submodule gelten jetzt als fehlerhaft, wenn sie geänderte oder nicht verfolgte Dateien enthalten , während dies zuvor nur der Fall war, wenn HEAD im Submodul auf das falsche Commit zeigte.
Die Bedeutung des Pluszeichens ( +
) in der Ausgabe des Git-Submoduls hat sich geändert. Wenn Sie zum ersten Mal darauf stoßen, dauert es eine Weile, bis Sie herausgefunden haben, was falsch läuft, z. B. indem Sie die Änderungsprotokolle durchsehen oder Git-Halbierung für Git verwenden .git, um die Änderung zu finden. Es wäre für die Benutzer viel freundlicher gewesen, ein anderes Symbol für "in der angegebenen Version, aber schmutzig" einzuführen.
Sie können das Problem beheben, indem Sie:
Übernehmen oder Rückgängigmachen der Änderungen / Entwicklungen in jedem Ihrer Submodule, bevor Sie zum übergeordneten Repo zurückkehren (wo der Diff keine "schmutzigen" Dateien mehr melden sollte). Um alle Änderungen an Ihrem Submodul rückgängig zu machen, gehen Sie einfach cd
in das Stammverzeichnis Ihres Submoduls und tun Sie diesgit checkout .
dotnetCarpenter kommentiert, dass Sie Folgendes tun können:git submodule foreach --recursive git checkout .
oder fügen Sie --ignore-submodules
Ihre hinzu git diff
, um diese "schmutzigen" Submodule vorübergehend zu ignorieren.
Neu in Git Version 1.7.2
Wie Noam weiter unten kommentiert , wird in dieser Frage erwähnt, dass Sie seit Git-Version 1.7.2 die schmutzigen Submodule ignorieren können mit:
git status --ignore-submodules=dirty
git commit -a
ohne sich Sorgen machen zu müssen, diese Änderungen hinzuzufügen. Obwohl sieM
vorne mit markiert sind , landen sie nicht in Ihrem Commit.git clean -id
.git submodule foreach --recursive git clean -id
(zuerst in einem Backup-Repo getestet werden;)).gitignore
. Das Hinzufügen dort oder zu meiner globalen Ignorierliste hat feste Dinge behoben.Auch das Entfernen das Submodul und dann läuft
git submodule init
undgit submodule update
wird natürlich den Trick tut, kann aber nicht immer sinnvoll oder möglich sein.quelle
Verwenden Sie den folgenden Befehl, um alle nicht verfolgten Dateien in einem Submodul zu ignorieren.
Es wird die folgende Konfigurationsoption zu Ihrer lokalen Git-Konfiguration hinzugefügt:
Weitere Informationen finden Sie hier
quelle
EDIT : Diese Antwort (und die meisten anderen) sind veraltet; siehe stattdessen Devpools Antwort .
Ursprünglich gab es keine Konfigurationsoptionen, um "
git diff --ignore-submodules
" und "git status --ignore-submodules
" zum globalen Standard zu machen (siehe auch Setzen von Git-Standardflags für Befehle ). Eine Alternative besteht darin, eine Standardkonfigurationsoptionignore
für jedes einzelne Submodul festzulegen, das Sie ignorieren möchten (für beidegit diff
undgit status
), entweder in der.git/config
Datei (nur lokal) oder.gitmodules
(wird von git versioniert). Beispielsweise:ignore = untracked
Nur nicht verfolgte Dateienignore = dirty
zu ignorieren , auch geänderte Dateienignore = all
zu ignorieren und auch Commits zu ignorieren. Es gibt anscheinend keine Möglichkeit, es für alle Submodule als Platzhalter zu verwenden.quelle
Dies ist der Fall, weil der Zeiger, den Sie für das Submodul haben, nicht der ist, der sich tatsächlich im Submodulverzeichnis befindet. Um dies zu beheben, müssen Sie
git submodule update
erneut ausführen :quelle
Dies hat mir nicht geholfen, aber es gab mir eine Liste von Dateien (in meinem Fall nur eine), die im Submodul geändert wurden (ohne dass ich dort etwas getan habe).
So konnte ich zum Submodul gehen und der Git-Status zeigte mir, dass mein HEAD getrennt war -> Git-Checkout-Master, Git-Status, um die geänderte Datei noch einmal zu sehen, Git-Checkout> Dateiname <, Git-Pull und alles wieder in Ordnung.
quelle
Am Ende habe ich das Submodul-Verzeichnis entfernt und es erneut initialisiert
quelle
Ein Submodul wird möglicherweise als fehlerhaft markiert, wenn die Dateimoduseinstellungen aktiviert sind und Sie die Dateiberechtigungen im Submodul-Teilbaum geändert haben.
Um den Dateimodus in einem Submodul zu deaktivieren, können Sie /.git/modules/path/to/your/submodule/config bearbeiten und hinzufügen
Wenn Sie alle schmutzigen Zustände ignorieren möchten, können Sie entweder die
ignore = dirty
Eigenschaft in der Datei /.gitmodules festlegen , aber ich denke, es ist besser, nur den Dateimodus zu deaktivieren.quelle
In meinem Fall war ich mir nicht sicher, was dies verursacht hatte, aber ich wusste, dass ich nur wollte, dass die Submodule auf ihr letztes Remote-Commit zurückgesetzt und damit fertig werden. Dies beinhaltete die Kombination von Antworten aus verschiedenen Fragen hier:
git submodule update --recursive --remote --init
Quellen:
Wie kann ich meine Änderungen auf ein Git-Submodul zurücksetzen?
Einfache Möglichkeit, die neuesten Git-Submodule zu ziehen
quelle