2016-10-26 2 views
4

Ich habe ein kompliziertes ionisches Projekt, das ich entwickle. Viele der Komponenten und Anbieter, die ich entwickle, sind generisch und können in anderen Projekten meiner Firma verwendet werden. Dies ist in der Softwareentwicklung üblich. Dies ist der Git-Workflow ich mit gekommen bin (diese Grafik zeigt Zweige):Wie kann ich einen bestimmten Ordner hinzufügen, wenn ich git subtree verwende?

my-company-library-repo ---- 
          |_ component 1 feature branch 
           |_ company component 1 feature branch testbed 
          |_ component 2 feature branch 

Die letzte Code-Komponente (nur eine .ts oder .js-Datei) im Testbed entwickelte Komponente Funktionszweig geschoben wird. Der Testbed-Code verbleibt im Testbed-Zweig. Im Feature-Zweig werden auch alle Dokumente ausgeführt, die die Komponente möglicherweise begleiten.

Jetzt in der Anwendung Repo füge ich das Feature Zweig als Unterbaum diesen Befehl:

git subtree add -P <destination-dir/feature> --squash <my-company-library-repo-url> <feature-branch-name> 

Und das gab mir die folgende (dieses Graph Ordnerstruktur zeigt):

my-app-repo------- 
        |_ company-library-feature-subtree 

Diese sollte nur die .js oder .ts und seine Dokumente in seinem Unterordner enthalten. Ich bekomme das nur zum Teil. Wenn es den Teilbaum zieht, ist es nur die Komponente ziehen und es ist doc-Dateien, aber die Dateien werden in eine sehr lange Liste von Unterverzeichnissen wie folgt gezogen:

my-app-repo/src/feature-branch/feature/src/app/providers/... 

Dies macht es schwer, die Bibliothek zu benutzen, weil Den Dateien werden so viele Verzeichnisse (unbenutzte Verzeichnisse) tiefgelegt.

Also, wenn ich meine 2 Dateien aus dem Feature-Testbed-Zweig in den Feature-Zweig schieben, wie kann ich nicht die gesamte Verzeichnisstruktur mit ihnen ziehen?

+0

Bitte bearbeiten Sie Ihren Beitrag, um weitere Informationen zu Ihrer Frage hinzuzufügen. Vermeiden Sie das Hinzufügen in den Kommentaren, da sie schwerer zu lesen sind und einfacher gelöscht werden können. Ich habe die Informationen aus Ihren vorhandenen Kommentaren in Ihre Frage bearbeitet (// stackoverflow.com/help/editing). –

+1

Beachten Sie, dass das Wort * push * in Git eine besondere Bedeutung hat: Sie pushen keine Dateien, Sie schieben Commits und das überträgt sie von einem Repository zu einem anderen. Ebenso hat * branch * spezielle Definitionen (und ist leider mehrdeutig), von denen keines Repositories durchkreuzt; und * pull * bedeutet * fetch-then-merge *, wobei * fetch * und * merge * ebenfalls Fachjargon sind. 'git subtree' ist kompliziert, weil es absichtlich mehrere Repositories, Commits und Zweige mischt und versucht, sie alle auf einmal zu tun. @ ScottWeldons Änderungen haben hier sehr geholfen, aber es wird immer noch verwirrend sein. :-) – torek

Antwort

3

Ich recherchierte Scott Weldon Lösung. Es würde funktionieren, aber es scheint git subtree spaltet das besagte Verzeichnis in seine eigene Repo. Zumindest habe ich davon gehört, dass ich Manpages und Bücher gelesen habe und was nicht. (Wenn ich falsch liege, was vielleicht der Fall ist, lass es mich bitte wissen.) Das wollte ich nicht tun.

Ich habe jedoch die Lösung für mein Problem gefunden. Hier ist, was ich tat, die Git Subtree Merge-Strategie mit (anstelle des GIT SUBTREE Befehl) in meinem Projekt:

$ git remote add my-library <my-library-url> 
$ git fetch my-library 
$ git checkout -b my-library-branch my-library/master 
$ git checkout master 
$ git read-tree --prefix=<desired/library/dir> -u my-library-branch 
$ git commit -m "Merged library project as subdirectory" 
$ git push 

Das hat super funktioniert. Ich habe meine Bibliothek in einem vernünftigen Unterordner. Zugegebenermaßen muss ich die ganze Bibliothek nehmen, nicht nur ein Stück wie eine benutzerdefinierte Komponente oder ein Anbieter, aber das ist in diesem Fall in Ordnung.

3

Vor dem Hinzufügen der Unterstruktur zu my-app-repo spaltete einen Teilbaum von my-company-library-repo:

# In my-company-library-repo 
git subtree split -P src/app/providers/... -b feature-new feature 

Dies wird eine neue Geschichte mit dem Inhalt src/app/providers/... an der Wurzel des Repo zu schaffen, an dem feature Zweig beginnen, und erstellen der Zweig feature-new am Ende dieser Geschichte.

Dann fügen Sie diesen neuen Zweig als Unterbaum my-app-repo:

# In my-app-repo 
git subtree add -P <destination-dir/feature> --squash <my-company-library-repo> feature-new 

Jetzt werden Sie den Inhalt src/app/providers/... bei <destination-dir/feature> haben.

Sie haben nicht erwähnt, ob Sie diesen Vorgang regelmäßig wiederholen werden, aber das ist auch möglich. Von der git-subtree man-Seite:

Wiederholte Splits mit genau der gleichen Geschichte sind garantiert identisch (dh, um die gleichen Commit-IDs zu erzeugen). Aus diesem Grund werden die neuen Commits, wenn Sie neue Commits hinzufügen und dann erneut splitten, als Commits über dem Verlauf angehängt, den Sie zuletzt generiert haben. Daher funktionieren 'git merge' und Freunde wie erwartet.

Verwandte Themen