Neue Commits für Git-Submodul ignorieren

Lesezeit: 9 Minuten

Neue Commits fur Git Submodul ignorieren
David Jarvis

Hintergrund

Verwenden von Git 1.8.1.1 unter Linux. Das Repository sieht wie folgt aus:

master
  book

Das Submodul wurde wie folgt erstellt:

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

Die book Submodul ist sauber:

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

Problem

Der Master hingegen zeigt, 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 auch der Master sauber ist:

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

Fehlgeschlagener Versuch Nr. 1 – schmutzig

In der Datei master/.gitmodules ist das Folgende, gemäß dieser Antwort:

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

Fehlgeschlagener Versuch Nr. 2 – nicht verfolgt

Geändert master/.gitmodules zu den folgenden, gemäß dieser Antwort:

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

Fehlgeschlagener Versuch Nr. 3 – showUntrackedFiles

Bearbeitet master/.git/config zu den folgenden, gemäß dieser Antwort:

[status]
   showUntrackedFiles = no

Fehlgeschlagener Versuch Nr. 4 – ignorieren

Das Buchverzeichnis zur Master-Ignore-Datei hinzugefügt:

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

Fehlgeschlagener Versuch Nr. 5 – Klonen

Das Buchverzeichnis 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 die book Submodul befindet sich in einem eigenen Repository-Verzeichnis unter der master Das Repository muss noch von Git ignoriert werden book Submodul? Folgendes sollte also nicht angezeigt werden:

#
#       modified:   book (new commits)
#

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

Ein Artikel über git submodul fallstricke deutet dies auf eine unangemessene Verwendung von Submodulen hin?

  • Normalerweise verwenden Sie Submodule, wenn Sie das Repository mit einer bestimmten Version eines anderen Repositorys verknüpfen und dies verfolgen möchten. Aber das scheint nicht das zu sein, was Sie wollen. Sie möchten nur ein Repository in einem anderen verwenden, ohne es zu verfolgen. Fügen Sie es dann nicht als Submodul hinzu.

    – Felix Klinge

    19. Januar 2013 um 20:16 Uhr

  • @FelixKling, wenn Sie solche Repos auf diese Weise hinzufügen und auf GitHub verschieben, würde es dann nur einen Link dafür erstellen, ohne den Inhalt dieser Ordner zu kopieren?

    – Roman Bekkiev

    14. November 2013 um 9:10 Uhr

  • @Roland: Submodule sind nur Dateien mit einem Verweis auf die Version eines anderen Repositorys. Sobald sie in einer lokalen Kopie des Repositorys initialisiert sind, werden sie durch den tatsächlichen Inhalt des Repositorys ersetzt.

    – Felix Klinge

    14. November 2013 um 9:13 Uhr

  • Ich denke, Sie suchen nach “ignore = all”

    – gruselig

    21. Oktober 2014 um 9:48 Uhr

  • Mit Git 2.13 (Q2 2017) können Sie darüber nachdenken git config submodule.<name>.active false. Siehe meine Antwort unten

    – VonC

    16. April 2017 um 17:54 Uhr

Neue Commits fur Git Submodul ignorieren
Shiv Kumar

Lauf einfach:

$ git submodule update

Dadurch wird das Submodul auf den alten Commit (angegeben im übergeordneten Repo) zurückgesetzt, ohne das übergeordnete Repo mit der neuesten Version des Submoduls zu aktualisieren.

  • Nein, ist es nicht, es wird den Status nicht ändern.

    – Ed Bishop

    12. Oktober 2016 um 17:32 Uhr

  • Warum genau würde OP wollen nicht habe das neuste von der book Repository? Ich glaube nicht, dass Ihre Antwort in diesem Zusammenhang Sinn macht.

    – Alexis Wilke

    27. November 2017 um 3:18 Uhr

  • @AlexisWilke und wenn sich die Buchschnittstelle dramatisch ändert und OP keine Zeit hat, Änderungen im Master-Repo vorzunehmen?

    – Logmann

    12. Dezember 2017 um 13:33 Uhr

  • können Sie dies tun, während Sie Konflikte während einer Zusammenführung beheben?

    – David 天宇 Wong

    21. Januar um 22:39 Uhr

1645911493 996 Neue Commits fur Git Submodul ignorieren
Newik Rehnel

Um ein weiteres Repository einzuschließen, das nicht in seinem Super-Repo verfolgt werden muss, versuchen Sie Folgendes:

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

Dann verpflichte dich.

Wie im verlinkten angegeben Artikel zu Fallstricken bei Git-Submodulen:

… die einzige Verknüpfung zwischen dem Eltern- und dem Submodul ist [the] aufgezeichneter Wert des ausgecheckten SHA des Submoduls, der in den Commits des Elternteils gespeichert ist.

Das bedeutet, dass ein Submodul nicht von seinem ausgecheckten Zweig oder Tag gespeichert wird, sondern immer von einem bestimmten Commit; Dieses Commit (SHA) wird wie eine normale Textdatei im Super-Repo (dasjenige, das das Submodul enthält) gespeichert (es ist natürlich als solche Referenz gekennzeichnet).

Wenn Sie einen anderen Commit auschecken im Submodul oder machen Sie einen neuen Commit darin, das Super-Repo wird sehen, dass sich sein ausgecheckter SHA geändert hat. Da bekommt man die modified (new commits) Zeile ab git status.

Um dies zu beseitigen, können Sie entweder:

  • git submodule updatewodurch das Submodul auf den aktuell im Super-Repo gespeicherten Commit zurückgesetzt wird (für Details siehe der git submodule manpage; oder
  • git add book && git commit um den neuen SHA im Super-Repo zu speichern.

Wie in den Kommentaren erwähnt, sollten Sie erwägen, die aufzugeben book Submodul: Klonen Sie es innerhalb des Super-Repos, wenn die Verfolgung seines Zustands als Teil des Super-Repos nicht erforderlich ist.

  • Wow, jetzt verstehe ich, warum das Supermodul muss die Version des Submoduls kennen. Natürlich ist es sinnvoll, dies zu tun git add book && git commit. Mir war nicht klar, dass Git tatsächlich sicherstellen kann, dass die beiden Repos synchron sind.

    – Sergej Orshanskiy

    12. April 2016 um 0:54 Uhr

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

Der erste sind nicht nachverfolgte Inhalte, die auftreten, wenn Sie Änderungen an Ihrem Submodul vornehmen, diese aber noch nicht festgeschrieben haben. Das übergeordnete Repository bemerkt dies und 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 jedoch festgeschrieben haben, wird das übergeordnete Repository dies erneut zur Kenntnis nehmen und sie entsprechend melden:

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

  • Stellen Sie sich vor, ich habe hinzugefügt ignore = all Option für alle Submodule. Irgendwann haben einige Module neue Commits, die gepusht wurden. Wenn jemand dann Super-Repo klont, wird es auf dem alten Stand der Submodule sein oder es werden die neuesten ausgecheckt?

    – FelikZ

    4. Juni 2015 um 8:39 Uhr

  • Mit dem Befehl git clone --recursive git@... Sie erhalten den alten Zustand der Submodule. Um sie zu aktualisieren, benötigen Sie etwas wie git submodule foreach "git pull" nach dem Klonen

    – gruselig

    4. Juni 2015 um 14:40 Uhr


  • Unglücklicherweise, ignore = all Option ignoriert die neuen Commits des Submoduls nicht. Ich verwende Git-Version 1.7.1. Irgendeine Idee, wie?

    – Romulus

    26. Juni 2017 um 16:55 Uhr

1645911494 887 Neue Commits fur Git Submodul ignorieren
VonC

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

Im Fall des OP:

git config submodule.<name>.active false

Sehen 1b614c0 übergeben, übertrage 1f8d711, bb62e0a übergeben, verpflichten 3e7eaed, a086f92 begehen (17. März 2017) und ee92ab9 übergeben, begehen 25b31f1, e7849a9 übergeben, übertrage 6dc9f01, übertrage 5c2bd8b (16. März 2017) von Brandon Williams (mbrandonw).
(Zusammengeführt von Junio ​​C. Hamano — gitster in a93dcb0 übergeben30. März 2017)

submodule: URL und Submodulinteresse entkoppeln

Derzeit die submodule.<name>.url config-Option wird verwendet, um festzustellen, ob ein bestimmtes Submodul für den Benutzer von Interesse ist. Dies ist in einer Welt, in der wir verschiedene Untermodule in verschiedenen Arbeitsbäumen oder einem allgemeineren Mechanismus zum Auswählen der interessierenden Untermodule auswählen möchten, mühsam.

In einer Zukunft mit Worktree-Unterstützung für Submodule wird es mehrere Arbeitsbäume geben, von denen jeder nur eine Teilmenge der ausgecheckten Submodule benötigen kann.
Die URL (über die das Submodul-Repository abgerufen werden kann) sollte sich zwischen verschiedenen Arbeitsbäumen nicht unterscheiden.

Es kann für Benutzer auch bequemer sein, Gruppen von Untermodulen, an denen sie interessiert sind, einfacher anzugeben, anstatt “git submodule init <path>” auf jedem Submodul, das sie in ihrem Arbeitsbaum auschecken möchten.

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

  • Die submodule.active config enthält eine Pfadspezifikation, die angibt, welche Submodule im Arbeitsbaum vorhanden sein sollen.
    • Die submodule.<name>.active config ist ein boolesches Flag, das verwendet wird, um anzuzeigen, ob dieses bestimmte Submodul im Arbeitsbaum vorhanden sein sollte.

Es ist wichtig, das zu beachten submodule.active funktioniert anders als die anderen Konfigurationsoptionen, da es eine Pfadangabe benötigt.
Dadurch können Benutzer mindestens zwei neue Workflows übernehmen:

  1. Submodule können mit einem führenden Verzeichnis gruppiert werden, so dass eine Pfadangabe zB ‘lib/‘ würde alle bibliotheksähnlichen Module abdecken, damit diejenigen, die an bibliotheksähnlichen Modulen interessiert sind, “submodule.active = lib/“nur einmal sagen, alle Module in ‘lib/‘ sind interessant.
  2. Sobald die Pathpec-Attribute-Funktion erfunden ist, können Benutzer Submodule mit Attributen kennzeichnen, um sie zu gruppieren, sodass eine breite Pathspec mit Attributanforderungen, z. B. ‘:(attr:lib)‘, kann verwendet werden, um alle Module mit dem ‘lib‘-Attribut sind interessant.
    Seit der .gitattributes Datei, genau wie die .gitmodules Datei, wird vom Superprojekt verfolgt, wenn sich ein Submodul im Superprojektbaum bewegt, kann das Projekt anpassen, in welchen Pfad das Attribut kommt .gitattributesgenauso wie es einstellen kann, in welchem ​​​​Pfad sich das Submodul befindet .gitmodules.

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

Nur wenn Ihr master Projekt erfordert die book Submodul, es ist eine nette Geste, es so zu belassen, denn auf diese Weise können andere Benutzer, die Ihr Projekt auschecken, sich daran erfreuen, kein Special zu haben git Befehl zum Ausführen (na ja … es gibt einige spezielle Befehle, um Submodule zu verwenden, aber es ist insgesamt immer noch einfacher zu verwalten, denke ich.)

In Ihrem Fall nehmen Sie Änderungen in der vor book Repository und irgendwann übertragen Sie diese Änderungen. Das bedeutet, Sie haben neue Zusagen in diesem Submodul, die eine neue SHA1-Referenz haben.

Was Sie im Master-Verzeichnis tun müssen, ist, diese Änderungen im Master-Repository festzuschreiben.

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

Dadurch wird die SHA1-Referenz in aktualisiert master auf die neueste verfügbare Version in der book Repository. Infolgedessen ermöglicht dieser Commit anderen, alle auszuchecken master & book Depots an der Spitze.

So erhalten Sie immer dann ein Commit mehr, wenn Sie Änderungen an einem Submodul vornehmen. Es ist halbtransparent, wenn Sie auch Änderungen an einigen Dateien in der vornehmen master -Repository, da Sie beide gleichzeitig festschreiben würden.

1645911494 859 Neue Commits fur Git Submodul ignorieren
Markus Amery

Laufen

git submodule update 

auf der Wurzelebene.

868480cookie-checkNeue Commits für Git-Submodul ignorieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy