Wie ändere ich ein Git-Submodul, um auf einen Unterordner zu verweisen?

101

Beim Durchblättern des SubModule-Tutorials habe ich aus dem Boto-Projekt ein Submodul erstellt . Dann stellte ich fest, dass ich tatsächlich nur eine Teilmenge dieses Projekts benötige - insbesondere den Boto- Ordner.

Ich möchte mein Submodul so ändern, dass es auf diesen Ordner verweist. Wenn ich in .gitmodules schaue, sehe ich

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

Welche URL sollte ich anstelle von https://github.com/boto/boto.git verwenden ? Soll ich nach dem Ändern der URL den Boto-Ordner lokal löschen und erneut abrufen?

ripper234
quelle
3
Es ist nicht genau das, was Sie wollen - kein Submodul - aber Sie könnten einen Blick darauf werfengit subtree
Cascabel
1
Am Ende hatte ich das gesamte Submodul und sagte IntelliJ, dass der Boto-Ordner ein 'Quellordner' ist, damit er darin Pakete finden kann.
Ripper234
15
Ich kann nicht glauben, dass Git das nicht von Haus aus macht ... yikes.
Rogerdpack
2
Fand eine ähnliche Frage - stackoverflow.com/questions/1121227/…
sashoalm

Antworten:

65

Ich fürchte, die URL für Submodule zeigt immer nur auf das Repository - Sie können nicht angeben, dass Sie nur einen Unterordner eines Repositorys möchten, genauso wie git "schmale Klone" im Allgemeinen nicht unterstützt.

Wenn Sie nicht damit leben können, das gesamte Repository als Submodul zu haben, können Sie jederzeit ein neues Repository erstellen, das von boto geklont wurde, und dann einen Cron-Job einrichten, um:

  1. git fetch dieses Repository in ein Verzeichnis
  2. Verwenden Sie git filter-branchdiese Option, um einen Zweig zu aktualisieren, in dem sich das Unterverzeichnis auf der obersten Ebene befindet.
  3. Fügen Sie diesen Zweig des Repositorys als Submodul hinzu. Das ist jedoch alles ein bisschen fummelig und ich würde es vorziehen, mit dem gesamten Repository als Submodul zu leben.
Mark Longair
quelle
24

Sie können nicht nur einen Teil eines Repositorys klonen. Dies liegt daran, dass git das Repository als ganzes Objekt behandelt: Wenn Sie es erhalten, erhalten Sie alles .

Die Lösung hier wäre also, das Submodul in einem anderen Verzeichnis abzurufen und dann einen Symlink zu verwenden, um Ihr Ziel zu erreichen.

Artefakt2
quelle
Ich habe Symlinks in Windows ... funktioniert auch gut. (Das liegt an msys, das ich auf meinem Computer habe, damit ich es ln -swie unter Linux verwenden kann.)
Kumarharsh
7
Vista und & kommen mit MKLink. Ich benutze das. howtogeek.com/howto/windows-vista/…
Angel S. Moreno
1
Sie können stattdessen harte Links verwenden
KindDragon
15

Sie möchten einen Zweig im Submodul erstellen, den Ordner nach oben verschieben und das löschen, was Sie nicht benötigen. Sie können dann stattdessen diesen Zweig verwalten. Wenn Sie Ihre Änderungen vorantreiben möchten, sollten Sie in der Lage sein, zuerst die Zusammenführung zurückzusetzen. Git wird wissen, dass Sie die Dateien verschoben und die Zusammenführung erfolgreich durchgeführt haben.

Hoffe das hilft.

Adam Dymitruk
quelle
Was ist ein "Back Merge"? Können Sie ein Beispiel anbieten?
Sukima
eine Zusammenführung, die "stromaufwärts" verläuft - von einem Zweig höherer Ordnung zu einem Zweig niedrigerer Ordnung. Linus hasst die. Sie knüpfen an die Geschichte anderer Zweige an, die möglicherweise bereits zusammengelegt wurden.
Adam Dymitruk
Könnten Sie bitte ein Beispiel für "Back Merge" in dieser Situation hinzufügen?
Xiao
In der Regel versuchen Sie, Ihren Feature-Zweig auf dem neuesten Stand zu halten, indem Sie Elemente aus einem Hauptzweig zusammenführen, in dem alle Benutzer ihre neuesten Änderungen zusammenführen. Das ist schlecht, weil es Ihren Zweig mit der Arbeit anderer verbindet. Wenn das Produkt Ihre Niederlassung benötigt, aber nicht eine der anderen, die sich bereits in der Integrationsniederlassung befinden, ist dies nicht möglich.
Adam Dymitruk
interessante Idee, hat jemand dies versucht? Ich werde es bald versuchen, bin mir aber immer noch nicht sicher, ob "Back Merge" klar und automatisiert sein kann ...
Moudrick