Ist es möglich, flache Submodule zu haben? Ich habe ein Superprojekt mit mehreren Submodulen, jedes mit einer langen Geschichte, so dass es unnötig groß wird, wenn man die ganze Geschichte in die Länge zieht.
Ich habe nur diesen unbeantworteten Thread gefunden .
Sollte ich nur das Git-Submodul hacken , um dies zu implementieren?
git
git-submodules
Mauricio Scheffer
quelle
quelle
git submodule add/update
" kann jetzt die Submodul-Repositorys flach klonen! Siehe meine Antwort untenAntworten:
Neu im kommenden git1.8.4 (Juli 2013) :
(Und Git 2.10 Q3 2016 ermöglicht es, dies mit aufzuzeichnen
git config -f .gitmodules submodule.<name>.shallow true
.Siehe das Ende dieser Antwort)
Siehe Commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Das heißt, das funktioniert:
Mit:
atwyman fügt in den Kommentaren hinzu :
Das ist wahr.
Das heißt, bis Git 2.8 (März 2016). Mit 2.8
submodule update --depth
hat der eine weitere Erfolgschance, selbst wenn der SHA1 direkt von einem der Remote-Repo-Köpfe aus erreichbar ist.Siehe Commit fb43e31 (24. Februar 2016) von Stefan Beller (
stefanbeller
) .Mit freundlicher
gitster
Unterstützung von Junio C Hamano ( ) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 9671a76 , 26. Februar 2016)MVG weist in den Kommentaren darauf hin , fb43e31 zu verpflichten (git 2.9, Feb 2016)
Update August 2016 (3 Jahre später)
Mit Git 2.10 (Q3 2016) können Sie dies tun
Weitere Informationen finden Sie unter " Git-Submodul ohne zusätzliches Gewicht ".
Git 2.13 (Q2 2017) fügt Commit 8d3047c (19. April 2017) von Sebastian Schuberth (
sschuberth
) hinzu .(Zusammengeführt von Sebastian Schuberth -
sschuberth
- in Commit 8d3047c , 20. April 2017)Allerdings Ciro Santilli fügt in den Kommentaren (und Details in seiner Antwort )
Git 2.20 (Q4 2018) verbessert die Submodul-Unterstützung, die aktualisiert wurde, um aus dem Blob zu lesen,
HEAD:.gitmodules
wenn die.gitmodules
Datei im Arbeitsbaum fehlt.Siehe Commit 2b1257e , Commit 76e9bdc (25. Oktober 2018) und Commit b5c259f , Commit 23dd8f5 , Commit b2faad4 , Commit 2502ffc , Commit 996df4d , Commit d1b13df , Commit 45f5ef3 , Commit bcbc780 (05. Oktober 2018) von Antonio Ospite (
ao2
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit abb4824 , 13. November 2018)Hinweis: Git 2.24 (Q4 2019) behebt einen möglichen Segfault beim Klonen eines flachen Submoduls.
Siehe Commit ddb3c85 (30. September 2019) von Ali Utku Selen (
auselen
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 678a9ca , 09. Oktober 2019)Git 2.25 (Q1 2020) verdeutlicht die
git submodule update
Dokumentation.Siehe Commit f0e58b3 (24. November 2019) von Philippe Blain (
phil-blain
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit ef61045 , 05. Dezember 2019)Warnung: Mit Git 2.25 (Q1 2020) war die Interaktion zwischen "
git clone --recurse-submodules
" und alternativem Objektspeicher schlecht gestaltet.Siehe Commit 4f3e57e , Commit 10c64a0 (02. Dezember 2019) von Jonathan Tan (
jhowtan
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 5dd1d59 , 10. Dezember 2019)Das ist detailliert in:
Mit Git 2.25 (Q1 2020) war die Interaktion zwischen "git clone --recurse-submodules" und dem alternativen Objektspeicher schlecht gestaltet.
Die Dokumentation zum Konfigurations-Submodul enthält jetzt:
quelle
--depth
sollte auch ein Argument nehmen;)uploadpack.allowReachableSHA1InWant
unduploadpack.allowTipSHA1InWant
auf dem Server wahrscheinlich Einfluss darauf haben, ob dies funktioniert. Ich habe heute einen Beitrag in die Git-Liste geschrieben , in dem ich darauf hinwies, wie die Verwendung von flachen Submodulen für einige Szenarien besser funktionieren könnte, nämlich wenn das Commit auch ein Tag ist. Lass uns abwarten und sehen..gitmodules
, funktioniert die--depth 1
Option Arbeit für Filialen , die nicht Meister eng Tracking werden?Git 2.9.0 unterstützt Submodule mit flachem Klon direkt, sodass Sie jetzt einfach Folgendes aufrufen können:
quelle
Nach Ryans Antwort konnte ich dieses einfache Skript entwickeln, das alle Submodule durchläuft und sie flach klont:
quelle
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
für jedes SubmodulBeim Durchlesen der "Quelle" des Git-Submoduls sieht es so aus, als
git submodule add
könnten Submodule verarbeitet werden, deren Repositorys bereits vorhanden sind. In diesem Fall...Sie sollten sicherstellen, dass sich das erforderliche Commit im Submodul-Repo befindet. Stellen Sie daher sicher, dass Sie eine geeignete Tiefe festlegen.
Bearbeiten: Möglicherweise können Sie mit mehreren manuellen Submodul-Klonen davonkommen, gefolgt von einem einzigen Update:
quelle
Zusammenfassung des fehlerhaften / unerwarteten / nervigen Verhaltens ab Git 2.14.1
shallow = true
in.gitmodules
wirkt sich nur ,git clone --recurse-submodules
wenn dieHEAD
von den entfernten Submodul auf die benötigte begehen, auch wenn das Ziel durch einen Zweig wird darauf verpflichten, und selbst wenn Sie setzenbranch = mybranch
die auf.gitmodules
auch.Lokales Testskript . Gleiches Verhalten auf GitHub 2017-11, wo
HEAD
die Standardeinstellung für das Zweig-Repo gesteuert wird:git clone --recurse-submodules --shallow-submodules
schlägt fehl, wenn das Commit weder von einem Zweig noch von einem Tag mit einer Nachricht referenziert wird :error: Server does not allow request for unadvertised object
.Lokales Testskript . Gleiches Verhalten auf GitHub:
Ich fragte auch auf der Mailingliste: https://marc.info/?l=git&m=151863590026582&w=2 und die Antwort war:
TODO-Test :
allowReachableSHA1InWant
.quelle
git clone --recursive
, die nur diesen bestimmten Commit abrufen.Sind die kanonischen Speicherorte für Ihre Submodule entfernt? Wenn ja, können Sie sie einmal klonen? Mit anderen Worten, möchten Sie die flachen Klone nur, weil Sie unter der verschwendeten Bandbreite häufiger Submodul- (Re-) Klone leiden?
Wenn Sie möchten, dass flache Klone lokalen Speicherplatz sparen, ist die Antwort von Ryan Graham ein guter Weg. Klonen Sie die Repositorys manuell so, dass sie flach sind. Wenn Sie denken, dass es nützlich wäre, passen Sie es an, um es
git submodule
zu unterstützen. Senden Sie eine E-Mail an die Liste, in der Sie danach gefragt werden (Ratschläge zur Implementierung, Vorschläge zur Benutzeroberfläche usw.). Meiner Meinung nach unterstützen die Leute dort potenzielle Mitwirkende, die Git auf konstruktive Weise ernsthaft verbessern wollen.Wenn Sie einen vollständigen Klon jedes Submoduls erstellen können (plus spätere Abrufe, um sie auf dem neuesten Stand zu halten), können Sie versuchen, mit der
--reference
Optiongit submodule update
(in Git 1.6.4 und höher) auf lokale Objektspeicher zu verweisen (z Erstellen Sie--mirror
Klone der kanonischen Submodul-Repositorys und verwenden Sie sie dann--reference
in Ihren Submodulen, um auf diese lokalen Klone zu verweisen. Lesen Sie unbedingt übergit clone --reference
/,git clone --shared
bevor Sie es verwenden--reference
. Das einzige wahrscheinliche Problem bei der Referenzierung von Spiegeln besteht darin, dass sie jemals Aktualisierungen ohne schnellen Vorlauf abrufen (obwohl Sie Reflogs aktivieren und ihre Ablauffenster erweitern können, um abgebrochene Commits beizubehalten, die ein Problem verursachen könnten). Sie sollten keine Probleme haben, solangeWenn Sie sich für so etwas entscheiden und die Möglichkeit besteht, dass Sie lokale Submodul-Commits in Ihren Arbeitsbäumen haben, ist es wahrscheinlich eine gute Idee, ein automatisiertes System zu erstellen, das sicherstellt, dass kritische Objekte, auf die von den ausgecheckten Submodulen verwiesen wird, dies nicht tun links in den Spiegel-Repositorys baumeln lassen (und wenn welche gefunden werden, kopieren Sie sie in die Repositorys, die sie benötigen).
Und, wie in der
git clone
Manpage angegeben, nicht verwenden,--reference
wenn Sie diese Auswirkungen nicht verstehen.Alternativ können Sie stattdessen
--reference
die Spiegelklone in Kombination mit der Standard-Hardlinking-Funktionalität verwenden,git clone
indem Sie lokale Spiegel als Quelle für Ihre Submodule verwenden.git submodule init
Bearbeiten Sie in neuen Superprojektklonen die Submodul-URLs so.git/config
, dass sie auf die lokalen Spiegel verweisen, und tun Sie danngit submodule update
. Sie müssten alle vorhandenen ausgecheckten Submodule erneut klonen, um die Hardlinks zu erhalten. Sie würden Bandbreite sparen, indem Sie nur einmal in die Spiegel herunterladen und dann lokal von diesen in Ihre ausgecheckten Submodule abrufen. Durch die feste Verknüpfung wird Speicherplatz gespart (obwohl Abrufe dazu neigen, sich über mehrere Instanzen der Objektspeicher der ausgecheckten Submodule zu sammeln und zu duplizieren), können Sie die ausgecheckten Submodule regelmäßig von den Spiegeln erneut klonen, um die von bereitgestellte Speicherplatzersparnis wiederherzustellen Hardlinking).quelle
Ich habe eine etwas andere Version erstellt, wenn sie nicht auf dem neuesten Stand ist, was nicht bei allen Projekten der Fall ist. Die Standard-Submodul-Ergänzungen funktionierten nicht und das obige Skript auch nicht. Also habe ich eine Hash-Suche für die Tag-Referenz hinzugefügt, und wenn es keine gibt, wird auf den vollständigen Klon zurückgegriffen.
quelle
Verweis auf Wie klone ich ein Git-Repository mit einer bestimmten Revision / einem bestimmten Änderungssatz?
Ich habe ein einfaches Skript geschrieben, das kein Problem hat, wenn Ihre Submodulreferenz vom Master entfernt ist
Diese Anweisung ruft die referenzierte Version des Submoduls ab.
Es ist schnell, aber Sie können Ihre Bearbeitung nicht für das Submodul festschreiben (Sie müssen sie vor https://stackoverflow.com/a/17937889/3156509 abrufen ).
vollständig:
quelle
Der flache Klon eines Submoduls ist perfekt, da sie bei einer bestimmten Revision / einem bestimmten Änderungssatz einen Schnappschuss erstellen. Es ist einfach, eine Zip-Datei von der Website herunterzuladen, also habe ich versucht, ein Skript zu erstellen.
git submodule deinit --all -f
Löscht den Submodulbaum, sodass das Skript wiederverwendbar ist.git submodule
Ruft die 40 Zeichen sha1 ab, gefolgt von einem Pfad, der dem gleichen in entspricht.gitmodules
. Ich verwende Perl, um diese durch einen Doppelpunkt getrennten Informationen zu verketten, und verwende dann eine variable Transformation, um die Werte inmysha
und zu trennenmysub
.Dies sind die kritischen Schlüssel, da wir den sha1 zum Herunterladen und den Pfad zum Korrelieren der
url
in .gitmodules benötigen.Bei einem typischen Submoduleintrag:
myurl
Tasten aufpath =
dann sieht 2 Zeilen nach, um den Wert zu erhalten. Diese Methode funktioniert möglicherweise nicht konsistent und muss verfeinert werden. Das URL-Grep entfernt alle verbleibenden.git
Typreferenzen, indem es mit dem letzten/
und allem bis zu a übereinstimmt.
.mydir
istmysub
minus ein Finale,/name
das durch das Verzeichnis zum Submodulnamen führen würde.Als nächstes folgt eine
wget
mit dem Format der herunterladbaren Zip-Archiv-URL. Dies kann sich in Zukunft ändern.Entpacken Sie die Datei,
mydir
zu der das im Submodulpfad angegebene Unterverzeichnis gehören soll. Der resultierende Ordner ist das letzte Element desurl
-sha1
.Überprüfen Sie, ob das im Submodulpfad angegebene Unterverzeichnis vorhanden ist, und entfernen Sie es, um das Umbenennen des extrahierten Ordners zu ermöglichen.
mv
Benennen Sie den extrahierten Ordner mit unserem sha1 in den richtigen Submodulpfad um.Gelöschte Zip-Datei löschen.
Submodul init
Dies ist eher ein WIP-Proof of Concept als eine Lösung. Wenn es funktioniert, ist das Ergebnis ein flacher Klon eines Submoduls mit einem bestimmten Änderungssatz.
Sollte das Repository ein Submodul für ein anderes Commit neu starten, führen Sie das zu aktualisierende Skript erneut aus.
Das einzige Mal, wenn ein solches Skript nützlich wäre, ist die nicht kollaborative lokale Erstellung eines Quellprojekts.
quelle