Entpacken von git-Unterverzeichnis und machen ein Submodul aus ihm heraus?
Begann ich ein Projekt vor einigen Monaten und gespeichert, alles in ein Haupt-Verzeichnis.
In meinem Haupt-Verzeichnis "Projekt" gibt es verschiedene Unterverzeichnisse, mit verschiedenen Dingen:
Projekt/Papier enthält ein Dokument in LaTeX geschrieben
Projekt/Quellcode/RailsApp enthält meiner rails-app.
"Projekt" ist GITified und es gab eine Menge von commits in "Papier" und "RailsApp" - Verzeichnis. Nun, wie ich verwenden möchte, cruisecontrol.rb für meine "RailsApp" ich Frage mich, ob es ist ein Weg, um ein Submodul aus "RailsApp" ohne die Geschichte.
- Auch eine sehr gute Antwort: stackoverflow.com/questions/359424/...
- Möglich, Duplikat der Trennen (Umzug) Unterverzeichnis in separaten Git-repository
Du musst angemeldet sein, um einen Kommentar abzugeben.
Heute gibt es einen viel einfacheren Weg, es zu tun als manuell mit git-filter-branch: git subtree
Installation
HINWEIS
git-subtree
ist jetzt Teil vongit
(wenn Sie installieren contrib) ab 1.7.11, so dass Sie vielleicht schon installiert haben. Sie können überprüfen Sie durch ausführengit subtree
.Installieren git-subtree von der Quelle (für ältere Versionen von git):
Oder, wenn Sie wollen, dass die man-Seiten und alle
Nutzung
Teilen eines größeren in kleinere Stücke:
Ausführliche Dokumentation (man-page), bitte Lesen Sie
git-subtree.txt
.git rm -rf ./foo
entferntfoo
ausHEAD
aber nicht filtermy-project
's vollständige Geschichte. Danngit submodule add [email protected]:my-user/new-project.git foo
macht nurfoo
ein Submodul ausgehend vonHEAD
. In dieser Hinsicht, scriptingfilter-branch
überlegen ist, wie es Genehmigungen zu erreichen "tun als ob, wenn subdir wurde ein Submodul von Anfang an"npm link && cd ../orig-proj && npm link extracted-module
Kasse git filter-branch.
Den
Beispiele
- Abschnitt des Mannes Seite zeigt, wie zum extrahieren eines sub-directory in das eigene Projekt, während alle, es ist Geschichte und verwirft die Geschichte von anderen Dateien/Verzeichnisse (genau das, was du suchst).Einen Weg, dies zu tun, ist die inverse - alles entfernen, aber die Datei, die Sie behalten möchten.
Grundsätzlich eine Kopie des repository, dann verwenden Sie
git filter-branch
alles entfernen, aber die Datei/Ordner, die Sie behalten möchten.Ich habe zum Beispiel ein Projekt, von dem ich Wünsche, um die Datei zu extrahieren
tvnamer.py
um ein neues repository:Verwendet
git filter-branch --tree-filter
gehen durch jeder Begehen, den Befehl auszuführen und erneut verpflichten, die entstehenden Verzeichnisse Inhalt. Das ist sehr destruktiv (so sollten Sie dies nur tun, auf einer Kopie des Repositorys!), und kann eine Weile dauern (über 1 minute auf ein repository mit 300 commits und über 20 Dateien)Den obigen Befehl nur ausgeführt wird das folgende shell-Skript auf jede revision, die Sie würde zu ändern haben natürlich (um es auszuschließen, deine sub-directory statt
tvnamer.py
):Die größte offensichtliche problem ist, es lässt alle commit-Nachrichten, auch wenn Sie unabhängig von der restlichen Datei. Das Skript git-remove-leer-commits, dies behebt..
Müssen Sie die
-f
force argument ausführenfilter-branch
wieder mit irgendetwas inrefs/original/
(die im Grunde eine Sicherung)Natürlich wird dies nie perfekt sein, zum Beispiel, wenn Ihre commit-Nachrichten noch andere Dateien, aber es ist ungefähr so nah einer aktuellen git erlaubt (soweit ich weiß jedenfalls).
Wieder, immer nur laufen diese auf einer Kopie des Repositorys! - aber in der Zusammenfassung, alle Dateien löschen, aber "thisismyfilename.txt":
git filter-branch
hat (heute?) ein built-in-option zum entfernen der leeren verpflichtet, nämlich--prune-empty
. Einen besseren guide zugit filter-branch
ist in den Antworten zu dieser Frage: stackoverflow.com/questions/359424/...Beide CoolAJ86 und apenwarr Antworten sind sehr ähnlich. Ich ging hin und her zwischen den beiden versuchen zu verstehen, bits, fehlten entweder ein. Unten ist eine Kombination von Ihnen.
Navigieren Sie zuerst Git Bash, um die Wurzel des git-repo aufgeteilt werden. In meinem Beispiel hier, das ist
~/Documents/OriginalRepo (master)
Unten ist eine Kopie von oben mit der customize-Lage-Namen ersetzt und mit https statt. Root-Ordner ist jetzt
~/Documents/_Shawn/UnityProjects/SoProject (master)
Wenn Sie übertragen wollen, um eine Teilmenge der Dateien in ein neues repository, sondern halten die Geschichte, Sie sind im Grunde geht, um am Ende mit einer völlig neuen Geschichte. Die Art und Weise dieser arbeiten würde, ist im Grunde wie folgt:
Sollte es etwas einfach, dies zu automatisieren, wenn Sie don ' T Verstand schreiben einer kleinen, aber hairy-Skript. Einfach, ja, aber auch schmerzhaft. Menschen getan haben, die Geschichte umzuschreiben im Git in der Vergangenheit, können Sie eine Suche für das.
Alternativ: clone das repository und löschen Sie das Papier in den Klonen, löschen Sie die app im original. Dies würde nehmen Sie eine minute, ist es garantiert zu arbeiten, und Sie können sich um wichtigere Dinge als zu versuchen, zu reinigen Sie Ihren git-Geschichte. Und keine sorgen über den Speicherplatz auf der Festplatte aufgenommen, indem redundante Kopien von Geschichte.