it-swarm.com.de

Ignoriere neue Commits für das Git-Submodul

Hintergrund

Verwendung von Git 1.8.1.1 unter Linux. Das Repository sieht folgendermaßen aus:

master
  book

Das Submodul wurde wie folgt erstellt:

$ cd /path/to/master
$ git submodule add https://[email protected]/user/repo.git book

Das Submodul book ist sauber:

$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean

Problem

Der Master zeigt hingegen, dass es "neue Commits" für das Buch-Submodul gibt:

$ cd /path/to/master/
$ 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)
#
#       modified:   book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

Git sollte das Submodul-Verzeichnis komplett ignorieren, damit der Master auch sauber ist:

$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean

Fehlgeschlagener Versuch Nr. 1 - verschmutzt

In der Datei master/.gitmodules ist wie folgt Antwort :

[submodule "book"]
        path = book
        url = https://[email protected]/user/repo.git
        ignore = dirty

Fehlgeschlagener Versuch Nr. 2 - nicht verfolgt

Geändert master/.gitmodules wie folgt Antwort :

[submodule "book"]
        path = book
        url = https://[email protected]/user/repo.git
        ignore = untracked

Fehlgeschlagener Versuch # 3 - showUntrackedFiles

Bearbeitet master/.git/config wie folgt Antwort :

[status]
   showUntrackedFiles = no

Fehlgeschlagener Versuch Nr. 4 - ignorieren

Das Buchverzeichnis wurde zur Master-Ignorierdatei hinzugefügt:

$ cd /path/to/master/
$ echo book > .gitignore

Fehlgeschlagener Versuch # 5 - Klon

Das Buchverzeichnis wurde wie folgt zum Master hinzugefügt:

$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book

Frage

Wie kann sich das Submodul book in einem eigenen Repository-Verzeichnis unter dem Repository master befinden, ohne das Submodul book zu ignorieren? Das heißt, Folgendes sollte nicht angezeigt werden:

#
#       modified:   book (new commits)
#

So unterdrücken Sie diese Meldung beim Ausführen von git status im Master-Repository?

Ein Artikel über Git-Submodul-Fallstricke deutet darauf hin, dass dies eine unangemessene Verwendung des Submoduls ist.

72
Dave Jarvis

Versuchen Sie Folgendes, um ein anderes Repository einzuschließen, das nicht in seinem Super-Repository nachverfolgt werden muss:

$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book
$ git add book
$ echo "book" >> .gitignore

Dann legen Sie fest.

Wie im verlinkten Git Submodul Fallstricke Artikel angegeben :

... die einzige Verbindung zwischen dem übergeordneten Modul und dem Submodul ist [der] aufgezeichnete Wert des ausgecheckten Submoduls SHA), der in den Commits des übergeordneten Moduls gespeichert ist.

Dies bedeutet, dass ein Submodul nicht durch seinen ausgecheckten Zweig oder sein ausgechecktes Tag gespeichert wird, sondern immer durch ein bestimmtes Commit. Dieses Commit (SHA) wird wie eine normale Textdatei im Super-Repo (das das Submodul enthält) gespeichert (es ist natürlich als solche Referenz markiert).

Wenn Sie ein anderes Commit im Submodul auschecken oder ein neues Commit darin ausführen, erkennt das Super-Repo, dass es ausgecheckt ist SHA hat sich geändert. Dann erhalten Sie die modified (new commits) -Zeile von git status.

Um dies zu beseitigen, können Sie entweder:

  • git submodule update, Wodurch das Submodul auf den aktuell im Super-Repo gespeicherten Commit zurückgesetzt wird (Details siehe die Manpage git submodule ; oder
  • git add book && git commit, Um das neue SHA im Super-Repo zu speichern.

Erwägen Sie, wie in den Kommentaren erwähnt, das Submodul book aufzugeben: Klonen Sie es im Super-Repo, wenn die Verfolgung seines Status als Teil des Super-Repos nicht erforderlich ist.

55
Nevik Rehnel

Renn einfach:

$ git submodule update

Dadurch wird das Submodul auf das alte Commit zurückgesetzt (in Parent-Repo angegeben), ohne dass das Parent-Repo mit der neuesten Version des Submoduls aktualisiert wird.

93
Shiv Kumar

Es gibt zwei Arten von Änderungsmeldungen, die Sie unterdrücken können (ab Git 1.7.2).

Der erste ist nicht verfolgter Inhalt, der auftritt, wenn Sie Änderungen an Ihrem Submodul vornehmen, diese jedoch noch nicht festgeschrieben haben. Das übergeordnete Repository bemerkt dies und der Git-Status meldet es entsprechend:

modified: book (untracked content)

Sie können diese unterdrücken mit:

[submodule "book"]
    path = modules/media
    url = https://[email protected]/user/repo.git
    ignore = dirty

Sobald Sie diese Änderungen festschreiben, nimmt das übergeordnete Repository dies jedoch erneut zur Kenntnis und meldet sie entsprechend:

modified:   book (new commits)

Wenn Sie diese ebenfalls unterdrücken möchten, müssen Sie alle Änderungen ignorieren

[submodule "book"]
    path = book
    url = https://[email protected]/user/repo.git
    ignore = all
19
greuze

Git 2.13 (Q2 2017) wird eine weitere Möglichkeit bieten, ein Submodul einzubinden, das nicht von seinem übergeordneten Repo verfolgt werden muss.

Im Falle des OP:

git config submodule.<name>.active false

Siehe Festschreiben 1b614c , Festschreiben 1f8d711 , Festschreiben bb62e0a , Festschreiben 3e7eaed , Festschreiben a086f92 (17. März 2017) und Festschreiben von ee92ab9 , Festschreiben von 25b31f1 , Festschreiben von e7849a9 , Festschreiben von 6dc9f01 , Commit 5c2bd8b (16. März 2017) von Brandon Williams (mbrandonw) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben von a93dcb , 30. März 2017)

submodule: URL- und Submodul-Interesse entkoppeln

Derzeit wird die Konfigurationsoption submodule.<name>.url Verwendet, um festzustellen, ob ein bestimmtes Submodul für den Benutzer von Interesse ist. Dies ist in einer Welt, in der wir verschiedene Submodule in verschiedenen Arbeitsbäumen auschecken oder einen allgemeineren Mechanismus zur Auswahl der gewünschten Submodule verwenden möchten, sehr umständlich.

In einer Zukunft, in der Submodule von WorkTree unterstützt werden, wird es mehrere Arbeitsbäume geben, von denen jeder möglicherweise nur eine Teilmenge der ausgecheckten Submodule benötigt.
Die URL (unter der das Submodul-Repository abgerufen werden kann) sollte sich nicht zwischen verschiedenen Arbeitsbäumen unterscheiden.

Benutzer können auch einfacher Gruppen von Submodulen angeben, an denen sie interessiert sind, anstatt "git submodule init <path>" Für jedes Submodul auszuführen, das in ihrem Arbeitsbaum ausgecheckt werden soll.

Zu diesem Zweck werden zwei Konfigurationsoptionen eingeführt, submodule.active Und submodule.<name>.active.

  • Die submodule.active - Konfiguration enthält eine Pfadangabe, die angibt, welche Submodule im Arbeitsbaum vorhanden sein sollen.
    • Die submodule.<name>.active - Konfiguration ist ein Boolesches Flag, mit dem angegeben wird, ob dieses bestimmte Submodul im Arbeitsbaum vorhanden sein soll.

Es ist wichtig zu beachten, dass submodule.active Anders funktioniert als die anderen Konfigurationsoptionen, da es eine Pfadangabe benötigt.
Auf diese Weise können Benutzer mindestens zwei neue Workflows anwenden:

  1. Submodule können mit einem führenden Verzeichnis gruppiert werden, so dass eine Pfadangabe, z. 'lib/' Würde alle bibliotheksinternen Module abdecken, damit diejenigen, die an bibliotheksinternen Modulen interessiert sind, "submodule.active = lib/" Nur einmal festlegen können, um alle Module in 'lib/' sind interessant.
  2. Sobald das Pathspec-Attribut-Merkmal erfunden ist, können Benutzer Submodule mit Attributen beschriften, um sie zu gruppieren, so dass eine breite Pathspec mit Attributanforderungen, z. ':(attr:lib)' kann verwendet werden, um zu sagen, dass alle Module mit dem Attribut 'lib' interessant sind.
    Da die Datei .gitattributes Genau wie die Datei .gitmodules Vom Superprojekt verfolgt wird, kann das Projekt beim Verschieben eines Submoduls im Superprojektbaum anpassen, welcher Pfad das Attribut erhält In .gitattributes kann genau wie in .gitmodules eingestellt werden, auf welchem ​​Pfad sich das Submodul befindet.
9
VonC

Die Antwort von Nevik Rehnel ist sicherlich die richtige für das, was Sie fragen: Ich wollte kein Submodul haben, wie zum Teufel komme ich aus dieser Situation heraus?!.

Nur wenn Ihr master -Projekt das book -Untermodul erfordert, ist es eine nette Geste, es als solches beizubehalten, da auf diese Weise andere Benutzer, die Ihr Projekt auschecken, keine speziellen git command to run (na ja ... es gibt einige spezielle Befehle, um Submodule zu verwenden, aber insgesamt denke ich, ist es immer noch einfacher zu verwalten.)

In Ihrem Fall nehmen Sie Änderungen im Repository book vor und übernehmen diese Änderungen an einem bestimmten Punkt. Dies bedeutet, dass Sie neue Commits in diesem Submodul haben, die eine neue SHA1-Referenz haben.

Im Masterverzeichnis müssen Sie diese Änderungen im Master-Repository festschreiben.

cd /path/to/master
git commit . -m "Update 'book' in master"

Dadurch wird die SHA1-Referenz in master auf die neueste im Repository book verfügbare Version aktualisiert. Infolgedessen können andere Benutzer mit diesem Commit alle master & book Repositorys an der Spitze auschecken.

Tatsächlich erhalten Sie also ein weiteres Commit, wenn Sie Änderungen an einem Submodul vornehmen. Es ist halbtransparent, wenn Sie auch Änderungen an einigen Dateien im Repository master vornehmen, da Sie beide gleichzeitig festschreiben würden.

1
Alexis Wilke