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
Das 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 Submodulverzeichnis vollständig 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 - schmutzig
In der Datei master/.gitmodules
befindet sich gemäß dieser Antwort Folgendes :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = dirty
Fehlgeschlagener Versuch Nr. 2 - nicht verfolgt
Gemäß master/.gitmodules
dieser Antwort wurde Folgendes geändert :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = untracked
Fehlgeschlagener Versuch Nr. 3 - showUntrackedFiles
master/.git/config
Nach dieser Antwort wie folgt bearbeitet :
[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 Nr. 5 - Klon
Das Buchverzeichnis wurde dem Master wie folgt hinzugefügt:
$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book
Frage
Wie kann sich das book
Submodul in einem eigenen Repository-Verzeichnis unter dem master
Repository befinden, ohne dass Git das book
Submodul ignoriert ? Das heißt, Folgendes sollte nicht angezeigt werden:
#
# modified: book (new commits)
#
Wie kann diese Nachricht bei der Ausführung git status
im Master-Repository unterdrückt werden ?
Ein Artikel über Fallstricke bei Git-Submodulen legt nahe, dass dies eine unangemessene Verwendung von Submodulen ist.
quelle
git config submodule.<name>.active false
. Siehe meine Antwort untenAntworten:
Versuchen Sie Folgendes, um ein weiteres Repository aufzunehmen, das nicht in seinem Super-Repo erfasst werden muss:
Dann begehen.
Wie im Artikel über Fallstricke bei verknüpften Git-Submodulen angegeben :
Das bedeutet, dass ein Submodul nicht durch seinen ausgecheckten Zweig oder 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 gekennzeichnet).
Wenn Sie ein anderes Commit im Submodul auschecken oder ein neues Commit darin ausführen, stellt das Super-Repo fest, dass sich das ausgecheckte SHA geändert hat. Dann bekommen Sie die
modified (new commits)
Leitung vongit status
.Um dies zu beseitigen, können Sie entweder:
git submodule update
, Der das Submodul die derzeit in der Super-Repo gespeichert commit (Details siehe wird zurückgesetzt , diegit submodule
Man - Page odergit add book && git commit
um den neuen SHA im Super-Repo zu speichern.Wie in den Kommentaren erwähnt, sollten Sie das
book
Submodul aufgeben : Klonen Sie es in das Super-Repo, wenn die Verfolgung seines Zustands als Teil des Super-Repos nicht erforderlich ist.quelle
git add book && git commit
. Mir war nicht klar, dass Git tatsächlich sicherstellen kann, dass die beiden Repos synchron sind.Lauf einfach:
Dadurch wird das Submodul auf das alte Commit zurückgesetzt (angegeben in Parent-Repo), ohne das Parent-Repo mit der neuesten Version des Submoduls zu aktualisieren.
quelle
book
Repository haben wollen? Ich denke nicht, dass Ihre Antwort in diesem Zusammenhang Sinn macht.Es gibt zwei Arten von Änderungsbenachrichtigungen, 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 diese und der Git-Status meldet sie entsprechend:
Sie können diese unterdrücken mit:
Sobald Sie diese Änderungen festschreiben, nimmt das übergeordnete Repository diese erneut zur Kenntnis und meldet sie entsprechend:
Wenn Sie diese ebenfalls unterdrücken möchten, müssen Sie alle Änderungen ignorieren
quelle
ignore = all
allen Submodulen eine Option hinzugefügt . Schließlich haben einige Module neue Commits, die gepusht wurden. Wenn jemand dann Super-Repo klont, befindet es sich dann im alten Zustand der Submodule oder werden die neuesten überprüft?git clone --recursive git@...
Sie den alten Zustand der Submodule. Um sie zu aktualisieren, benötigen Sie etwas wiegit submodule foreach "git pull"
nach dem Klonenignore = all
ignoriert die Option die neuen Commits des Submoduls nicht. Ich verwende Git Version 1.7.1. Irgendeine Idee?Git 2.13 (Q2 2017) wird eine weitere Möglichkeit hinzufügen, ein Submodul einzuschließen, das nicht von seinem übergeordneten Repo verfolgt werden muss.
Im Fall des OP:
Siehe Commit 1b614c0 , Commit 1f8d711 , Commit bb62e0a , Commit 3e7eaed , Commit a086f92 (17. März 2017) und Commit ee92ab9 , Commit 25b31f1 , Commit e7849a9 , Commit 6dc9f01 , Commit 5c2bd8b (16. März 2017) von Brandon Williams (
mbrandonw
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit a93dcb0 , 30. März 2017)quelle
<name>
für ein Untermodul in einem bestehenden Projekt?.git/config
->[submodule "<name>"]
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 für Ihr
master
Projekt dasbook
Submodul erforderlich ist , ist es eine nette Geste, es als solches beizubehalten, da andere Benutzer, die Ihr Projekt auschecken, auf diese Weise keinen speziellengit
Befehl ausführen können (naja ... es gibt einige spezielle Befehle, die verwendet werden müssen) Submodule, aber insgesamt ist es immer noch einfacher zu verwalten, denke ich.)In Ihrem Fall nehmen Sie Änderungen im
book
Repository vor und übernehmen diese Änderungen irgendwann. Dies bedeutet, dass Sie in diesem Submodul neue Commits haben , die eine neue SHA1-Referenz haben.Im Master-Verzeichnis müssen Sie diese Änderungen im Master-Repository festschreiben.
Dadurch wird die SHA1-Referenz
master
auf die neueste imbook
Repository verfügbare Version aktualisiert . Infolgedessen können andere mit diesem Commit allemaster
&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
master
Repository vornehmen, da Sie beide gleichzeitig festschreiben würden.quelle
Lauf
auf der Wurzelebene.
quelle
git status
Aussagen. Es glaubt immer noch, dass Veränderungen stattgefunden haben.