2017-04-08 11 views
0

Ich versuche, einen Zweig so einzurichten, dass branchA Unterordner A und B enthält, aber B enthält den Inhalt von branchB.Anderen Zweig als Unterverzeichnis hinzufügen?

Ich habe submodules, subtrees und subrepos betrachtet, aber ich kann nicht herausfinden, was tun würde, was ich suche.

Um zu verhindern, dass dies zu einem XY-Problem wird, ist meine übergeordnete Situation folgende: Ich entwickle ein HTML5/JS-Spiel und möchte es auf Github Pages testen können.
Also ich möchte Zweig/Unterverzeichnis gh-pages/play enthalten den Zweig master.

Antwort

1

Zweige haben keine Ordner/Verzeichnisse. Branches sind, ganz einfach, Zeiger auf Hash-IDs zu beglaubigen (sie beginnen als kleine Dateien mit der rohen Hash-ID, obwohl sie in eine Art Datenbank von Name-zu-ID-Mapping komprimiert werden können, was Git tut, um Zeit zu sparen und Platz für Namen, die sich nicht ständig ändern). Es ist also nicht direkt möglich.

Es ist möglich zu tun, was Sie wollen mit Submodulen, obwohl. Es ist nur knifflig. Du musst sehr vorsichtig sein. Es ist mir auch überhaupt nicht klar, ob es überhaupt mit dieser Sache von GitHub Pages funktionieren wird, da sie eine Clone-and-Checkout-mit-Submodul-Operation durchführen müssen.

A Git Submodul ist wirklich nur ein weiteres Git-Repository: Sie Git sagen, dass einige Verzeichnis ("Ordner") wie B sollte, von einer bestimmten URL durch Klonen eines verschiedenen Git-Repository durchgeführt werden. Sobald der Klon fertig ist, sollte Git dann cd in das Verzeichnis, das die git clone macht, und git checkout ein bestimmtes Commit, durch Hash-ID.

Nun, was ist, wenn Sie für das "andere" Git-Repository, das Sie wollen git://host.name/path/to/url.git in Unterverzeichnis B auschecken, geben Sie die URL git://host.name/path/to/url.git?

Die offensichtliche Gefahr hier ist das Potenzial für endlose Rekursion: Git url.git auscheckt, sieht, dass es ein Submodul hat, Klone url.gitB Unterverzeichnis innerhalb B der Commit auscheckt sieht, dass es ein Submodul hat, Klone es, cd s zu dem, was jetzt ist B/B, sieht, dass es ein Submodul hat, Klone es geht in B/B/B sieht, dass es ein Submodul hat ...

Sie diese endlose Rekursion vermeiden durch:

  • Klonen ohne Re kursive Submodul-Extraktion (dies ist die Standardeinstellung für git clone) und/oder
  • , die sehr sicher machen, dass das spezifische Commit für das Submodul niemals ein Commit enthält, das das Submodul als Submodul hat.

Es gibt noch ein weiteres Problem: Submodule Besuche einer bestimmten commit von Hash-ID, nicht durch Zweignamen. Sie wollten B, um ein Selbst-Klon zu sein, der Zweig master auscheckt (der vermutlich nie ein Selbstmodul B hat).Aber alles, was Sie können erhalten ist ein B, die eine bestimmte Git-Hash-ID auscheckt, die die Hash-ID ist, die Sie im Commit im Superprojekt gespeichert haben (das ist natürlich das gleiche Repository).

Es gibt einige Möglichkeiten, das Submodul von seinem Ein-spezifischen-Commit zu trennen, einschließlich der Möglichkeiten, einen Zweig nach Branch-Name auszuchecken. Dazu müssen spezifische git submodule Befehle ausgeführt werden, was dazu führt, dass Sie dies auf GitHub Pages (was immer das auch ist) verhindern können. Aber, vorausgesetzt, sie lassen Sie die Submodul-Sache überhaupt tun, müssen Sie es nicht unbedingt durch Name gehen: Sie können nur eine neue Festschreibung machen, die den neuen master Hash in das Superprojekt speichert.

Sagen Sie zum Beispiel, Sie sind auf Zweig develop in diesem Superprojekt-mit-Selbst-als-Submodul. In develop gibt es eine .gitmodules Datei, die besagt: "Ich habe ein Submodul/Unterprojekt, das Sie in B klonen sollten, indem Sie diese URL hier verwenden" (die URL des Superprojekts). Unter der Tipp-Commit von entwickeln Sie haben ein Commit mit einem "gitlink" Baum Eintrag, der sagt "machen einen Klon in B, Nachschlagen der Teilprojekt URL in .gitmodules, und mit Hash deadb0a" -welche ist der Hash der Tipp commit der Filiale master.

Sobald Sie die Spitze master zu einem neuen begehen ac0ffee vorrücken, überprüfen Sie develop und machen eine neue verpflichten, dass eine „gitlink“ Baum-Eintrag hat, der sagt „einen Klon in B machen Hash mit ac0ffee“ . Nichts anderes changes-nur der Hash-ID, aber jetzt, wenn jemand checkt developmit Submodule aktiviert ist, erhalten sie das gleiche in B begehen, dass sie würden, indem Sie aus Zweigmaster in B, weil Zweig master sagt „check out Hash ac0ffee ".

(Offensichtlich ist diese ganze Sache ist ein bisschen fehleranfällig, als Submodule im Allgemeinen ist. Ich vermute, das nach unten zu gehen, nicht ein sehr weiser Weg ist. Aber in der Theorie zumindest, kann es funktionieren.)

+0

Interessante Tatsache: Submodule können nun Zweige verfolgen. –

+0

@DuncanXSimpson: Daher * Es gibt einige Möglichkeiten, das Submodul von seinem ein-spezifischen Commit zu entfernen, einschließlich Möglichkeiten, es einen Zweig nach Zweig-Name auschecken zu lassen. Dazu müssen bestimmte Git-Submodul-Befehle ausgeführt werden ... * Sie müssen den Namen der Verzweigung festlegen (die Sie in der Datei '.gitmodules' speichern können) und dann' git submodule update --remote' oder 'git ausführen Submodul Checkout - Fernwartung ". – torek

Verwandte Themen