Ignorieren Sie ein Git-Submodul in Ihrem .gitignore oder schreiben Sie es Ihrem Repo zu?

91

Ich habe ein Modul zu meinem Projekt in dem Nachspiel project_dir/vendor/submodule_onejetzt jedes Mal , wenn ich laufe git statusbekomme ich modified: vendor/submodule_one (new commits).

Meine Frage ist, wie ich am besten damit umgehen kann. vendor/submodule_oneFüge ich den Ordner-zu meinem hinzu, .gitignoreda mein Hauptprojekt nicht über die Besonderheiten meines Submoduls Bescheid wissen muss?

Oder muss ich beim Ändern und Festschreiben von Änderungen an meinem Submodul auch in meinem Hauptprojekt Festschreibungen vornehmen?

Ich habe gerade mit Submodulen angefangen und konnte nicht viele Informationen finden, außer sie einzurichten.

sprysoft
quelle

Antworten:

78

Nein, Sie müssen Ihr Submodul nicht zu Ihrem hinzufügen .gitignore: Was die Eltern von Ihrem Submodul sehen, ist ein Gitlink (ein spezieller Eintragmode 160000 ).

Das heißt: Auf jede Änderung, die direkt in einem Submodul vorgenommen wird, muss ein Commit im übergeordneten Verzeichnis folgen.
Auf diese Weise zeichnet das übergeordnete Verzeichnis das richtige Commit für den Status des Submoduls auf: Dieses Commit ist der oben erwähnte "Gitlink";

Weitere Informationen zu dieser Richtlinie finden Sie unter " Aktualisierung des Git-Submoduls (wahre Natur der Submodule) ".
Die Hauptidee hinter Submodulen ist ein komponentenbasierter Ansatz , bei dem Sie bei bestimmten Commits auf andere Repos verweisen. Wenn Sie jedoch Änderungen an diesen Submodulen vornehmen, müssen Sie diese Referenzen auch im übergeordneten Repo aktualisieren.


Beachten Sie, dass Sie mit Git 2.13 (Q2 2017) das Submodul ignorieren können, obwohl Sie den Gitlink nicht ignorieren:

git config submodule.<name>.active false

Weitere Informationen finden Sie unter " Neue Commits für Git-Submodul ignorieren ".


Hinweis: Mit Git 2.15.x / 2.16 (Q1 2018) ist das Ignorieren eines Submoduls genauer.
" git status --ignored --untracked" hat nicht an einem Arbeitsbaum eines separaten Projekts angehalten, das in ein ignoriertes Verzeichnis eingebettet ist und Dateien in diesem anderen Projekt aufgelistet hat, anstatt nur das Verzeichnis selbst als ignoriert anzuzeigen.

Siehe Commit fadb482 (25. Oktober 2017) von Johannes Schindelin ( dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit da7996a , 06. November 2017)

status: Lassen Sie sich nicht von Submodulen in ausgeschlossenen Verzeichnissen verwirren

Wir übergeben das excludeFlag akribisch an die treat_directory()Funktion, damit wir angeben können, dass darin enthaltene Dateien beim Rekursieren eher ausgeschlossen als nicht verfolgt werden.

Aber wir haben Submodule noch nicht gleich behandelt.

Aus diesem Grund würde git status --ignored --untrackedmit einem Submodul submodulein einem Gitignored tracked/das Submodul im Untracked filesAbschnitt " " angezeigt , z

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Stattdessen möchten wir, dass das Submodul im Ignored filesAbschnitt " " angezeigt wird:

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/
VonC
quelle
1
Danke VonC, macht vollkommen Sinn, wenn Sie es so ausdrücken.
sprysoft
7
Diese Antwort ist verwirrend, da im Fragentitel gefragt wird, ob Submodulordner ignoriert werden sollen oder nicht, und Sie später im Hauptteil der Frage mit Ja auf eine separate Frage antworten.
SgtPooki
1
Ich denke, es macht jetzt viel mehr Sinn und liefert einige sehr nützliche detaillierte Informationen. Super, danke für die Aktualisierung :)
SgtPooki
Argument für .gitignore: Warum .gitsubmodules-Datei einchecken, wenn die darin enthaltene URL möglicherweise eine benutzerspezifische git-URL mit einem Benutzernamenparameter enthalten könnte?
Djangofan
1
@djangofan Bei der Frage (und meiner Antwort) ging es darum, den Submodul- Ordner selbst zu ignorieren (den Ordner , der durch einen Gitlink dargestellt wird). Es geht nicht darum, die .gitmodulesDatei zu ignorieren . Es ist wahr, dass diese eine Datei (die .gitmodules) Anmeldeinformationen enthalten kann, aber wenn sie nur zum Klonen öffentlicher Repos verwendet werden, müssen sie diese nicht enthalten. Außerdem können sie auch unter Windows mit Hilfe von Anmeldeinformationen wie dem "Git Credential Manager für Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ) zwischengespeichert werden. Anmeldeinformationen in der .gitmodulesist also kein Todesfall.
VonC
7

Aus irgendeinem Grund hat submodule.module-name.active bei mir nicht funktioniert.

Deshalb habe ich submodule.module-name.ignore verwendet

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - hier finden Sie eine Beschreibung möglicher Parameterwerte

Funktioniert für mich für (neue Commits) und (geänderte Inhalte) Nachrichten.

Vladimir
quelle
1

Um die akzeptierte Antwort zu ergänzen, habe ich festgestellt, dass das Hinzufügen des Git-Submodul-Ordners zu .gitignore tatsächlich Probleme verursacht - insbesondere beim Versuch, einen neuen Klon des Projekts zu erstellen. Insbesondere führte das Ausführen der normalen Submodul-Klonbefehle dazu, dass der Submodul-Ordner leer war:

git submodule init
git submodule update
git pull --recurse-submodules

Nur durch den Versuch, erneut zu starten

git submodule add <Git repo> <submodule folder>

Es war klar, was das Problem war, basierend auf der Ausgabe:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Anstatt hinzuzufügen -f, habe ich den Git-Submodul-Ordner aus .gitignore entfernt und die Submodul-Klonbefehle erneut ausgeführt, wodurch der Ordner nun erfolgreich erstellt wurde. Ich denke, dass es einen Fehler geben kann, dass einer der Submodul-Klonbefehle .gitignore respektiert, aber nicht warnt, dass er ein Submodul entsprechend überspringt.

Woodz
quelle