Wie entferne ich den Status der nicht verfolgten Git-Submodule?

149

Ich kann scheinbar nicht verfolgte Inhalte in Gits Submodulen nicht loswerden. Laufende git statusErträge:

# Auf Zweigstellenmaster
# Änderungen, die nicht für das Festschreiben bereitgestellt wurden:
# (Verwenden Sie "git add ...", um zu aktualisieren, was festgeschrieben wird.)
# (Verwenden Sie "git checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen.)
# (Festschreiben oder Verwerfen des nicht verfolgten oder geänderten Inhalts in Submodulen)
#
# geändert: Bundle / Snipmate (nicht verfolgter Inhalt)
# geändert: Bundle / Surround (nicht verfolgter Inhalt)
# geändert: Bundle / Trailing-Whitespace (nicht verfolgter Inhalt)
# geändert: Bundle / Zen-Codierung (nicht verfolgter Inhalt)
#
Keine Änderungen zum Festschreiben hinzugefügt (verwenden Sie "git add" und / oder "git commit -a")

Durch Hinzufügen des --ignore-submodulesParameters werden diese Meldungen ausgeblendet. aber ich frage mich, ob es einen Weg gibt, diesen Schmutz auf eine geeignetere, kernige Weise loszuwerden.

Tomer Lichtash
quelle
3
Diese Antwort: stackoverflow.com/a/5127213/199649 ruft mehr Optionen hervor.
Charlax

Antworten:

95

Da der Git-Status nicht verfolgten Inhalt meldet, besteht der eigentliche Weg, einen sauberen Status zu erhalten, darin, in jedes dieser Submodule zu gehen und:

  • Hinzufügen und Festschreiben der nicht verfolgten Inhalte,
  • oder verweisen Sie auf die nicht verfolgten Inhalte in einem .gitignorebestimmten Modul.
  • oder Sie können den gleichen ignoriert Inhalt des Submodul der hinzufügen .git/info/exclude, wie peci1 Berichte in den Kommentaren .
  • oder schmutzig Submodul Spezifikation hinzuzufügen, wie in erwähnt ezraspectre ‚s Antwort (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • oder fügen Sie eine globale .gitignore Datei hinzu (häufig ~/.gitignore-global). Wie zum Beispiel .DS_Storeoder in meinem Fall, Carthage/Buildwie von Marián Černý in den Kommentaren berichtet . Siehe .gitginoreManpage :

Muster, die ein Benutzer von Git in allen Situationen ignorieren lassen möchte (z. B. Sicherungs- oder temporäre Dateien, die vom Editor des Benutzers der Wahl generiert wurden), werden im Allgemeinen in eine Datei eingegeben, die von core.excludesFiledem Benutzer angegeben wird ~/.gitconfig. Der Standardwert ist $XDG_CONFIG_HOME/git/ignore. Wenn $XDG_CONFIG_HOMEentweder nicht gesetzt oder leer $HOME/.config/git/ignoreist, wird stattdessen verwendet.

VonC
quelle
5
+1, ich war fast bereit zu schreien, bis ich dies fand ... dann wurde mir klar .DS_Store, dass in einem meiner Submodule automatisch eine Datei (von OS X) erstellt wurde, die mich daran hinderte, das Hauptprojekt zu starten. Arg! Zeit zum Update .gitignore...
Courtney Christensen
Mit Xcode fand ich es auch nützlich, * .xcuserdatad zur .gitignore-global-Datei hinzuzufügen. Dies verhindert, dass git versucht, lokale Xcode-Einstellungen zu verfolgen.
Roy Sharon
Wenn Sie keine Push-Rechte für das Submodul haben, können Sie Ihre Änderungen am Submodul nicht für andere Benutzer des übergeordneten Repos freigeben. Die Lösung von @ quincyglenn scheint in einem solchen Fall zu funktionieren.
Drew Noakes
1
@VonC, jede Antwort ist je nach Situation und Präferenz sinnvoll. Ich wollte die Unterscheidung hier als Hinweis auf andere hervorheben. Übrigens, danke für deine vielen Antworten zu Git hier auf SO - du hast mir schon oft geholfen.
Drew Noakes
2
Sie können sogar darauf verzichten, einen .gitignore festzuschreiben und zu erstellen (der selbst nicht mehr verfolgt wird). Öffnen Sie die Submodule .git/info/excludeund fügen Sie dort die Ignorierzeilen hinzu (es funktioniert wie ein Gitignore, ist jedoch nicht Teil des gemeinsam genutzten Repositorys).
Martin Pecka
144

Ich fand, dass dieser Blog-Beitrag insgesamt funktioniert. Durch Hinzufügen der ignore = dirtyOption zu jedem Eintrag in der .gitmodulesDatei.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
quelle
Meine bevorzugte Lösung, da sie leicht automatisiert werden kann.
tödliche Gitarre
24
Erwähnenswert ist, dass ignore = untrackedauch vorhanden ist und geänderte verfolgte Dateien, aber keine nicht verfolgten Dateien angezeigt werden. Es wäre schön, wenn es eine globale Einstellung für alle Submodule geben würde ...
naught101
12

Sie können auch zu jedem Submodul-Verzeichnis gehen und als separater Git fungieren. Beispielsweise:

cd my/project/submodule
git status

... / erhält die Liste der geänderten Dateien /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

Sie können auch Ihr Remote-Submodul-Repo mit aktualisieren

git submodule update

Nach alldem

Ricardo Martins
quelle
5
Sie möchten wahrscheinlich nicht auf die git add .Überprüfung der geänderten Dateien verzichten. Meistens handelt es sich bei den vorgenommenen Änderungen um die hinzugefügten .DS_StoreDateien - dies sollte wahrscheinlich von Ihnen .gitignoreerfasst werden, wie zourtney im ersten Kommentar zur Antwort erwähnt hat.
Gregoltsov
Falls Sie die Submodule tatsächlich nicht aktualisieren und zum ursprünglichen Status zurückkehren möchten, möchten Sie möglicherweise ausführen git submodule update --force.
Tom
4

Dies kann an der detached HEADin Ihrem Submodul-Zweig liegen. Wenn dies der Fall ist, gehen Sie in Ihren Submodulpfad (zB :) ./bundle/snipmateund führen Sie ihn aus git checkout master.

Browny Lin
quelle
2

Ich habe mich gestern in einem Projekt mit fast 12 Submodulen mit diesem Thema beschäftigt.

git status zeigte Ausgabe.

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

Um die untracked Inhalt Fehler zu beheben, musste ich die untracked Dateien von allen Submodule entfernen (alle waren *.pyc, *.pyoerzeugten Dateien von Python) unter Verwendung eines .gitignore.

Um das andere zu lösen, musste ich ausführen, git submodule updatewelches jedes der Submodule aktualisiert.

mu 無
quelle
1

In meiner Situation klone ich Module als Ausgangspunkt für ein neues Modul in meiner ZF2-Umgebung. Dazu wird ein eigener .git-Ordner in das Verzeichnis gestellt.

In diesem Fall können Sie den Ordner .git löschen (wahrscheinlich müssen Sie versteckte Dateien anzeigen, um ihn anzuzeigen).

HappyCoder
quelle
1

Dies passiert wahrscheinlich, wenn Sie einen anderen .git [versteckten Ordner] in dem bestimmten Ordner haben.

geändert: ./../ .. (geänderter Inhalt, nicht verfolgter Inhalt)

Stellen Sie sicher, dass Ihr Unterverzeichnis diesen .git-Ordner nicht enthält.

In diesem Fall kann das Problem behoben werden, indem der Ordner .git manuell aus dem Unterverzeichnis gelöscht wird.

Subrat Kumar Palhar
quelle
1

Ich bevorzuge die Verwendung von SourceTree , daher bestand die Lösung für mich darin, das Submodul-Repo in SourceTree zu öffnen, in dem die Liste aller nicht verfolgten Dateien angezeigt wird. Ich habe sie dann alle in einer Gruppe ausgewählt und dann "Entfernen" verwendet.

Ich konnte dies tun, weil ich wusste, dass alle nicht verfolgten Dateien nicht wirklich benötigt wurden.

Glenn Lawrence
quelle
1

Das hat für mich ganz gut geklappt:

git update-index --skip-worktree <path>

Wenn es mit dem nicht funktioniert pathname, versuchen Sie es mit dem Dateinamen. Lassen Sie mich wissen, ob dies auch für Sie funktioniert hat.

DarkCrazy
quelle
-1

Wenn dies ein vorübergehendes Problem ist, können Sie in den Submodulordner gehen und es ausführen, git reset HEAD --hardaber Sie verlieren alle Ihre Änderungen innerhalb des Submoduls.

Daigo
quelle