2010-03-29 14 views
31

Angenommen meine git-Repository hat die folgende Struktur:Teil eines Git Repository extrahieren?

/.git 
/Project 
/Project/SubProject-0 
/Project/SubProject-1 
/Project/SubProject-2 

und das Repository hat recht einige Commits. Jetzt wird eines der Unterprojekte (SubProject-0) ziemlich groß, und ich möchte SubProject-0 herausnehmen und es als eigenständiges Projekt einrichten. Ist es möglich, den gesamten Commit-Verlauf von SubProject-0 aus dem übergeordneten Git-Repository zu extrahieren und in ein neues zu verschieben?

+2

Beachten Sie, dass dies ein Duplikat von http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository ist (wie Jim DeLaHunt in seiner Antwort sagt). –

Antwort

36

Siehe http://git-scm.com/docs/git-filter-branch

Ich glaube, Sie so etwas wie

git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all 

in einem Klon des Repository benötigen.

+0

Danke! Klappt wunderbar! – Rio

+2

@Rio Sie können auch die Option '--prune-empty' verwenden, um Commits zu löschen, die nur' Project/SubProject-0' berührten. –

+0

wow funktioniert perfekt! danke – alvatar

1

Ich musste etwas ähnliches tun, aber ich wollte im Wesentlichen ein Unterprojekt von einem Repo zu einem anderen verschieben. Stattdessen habe ich fetch verwendet, da es Objekte aus jeder Quelle abrufen kann.

Also, im Grunde, ich habe einen neuen Zweig erstellt, löschte die nicht benötigten Sachen in diesem Zweig, dann verwendet git fetch den Zweig von einem Repo zu einem anderen zu ziehen. Sobald ich die Objekte hatte, machte Merge den Trick.

z.

Auf dem Repository, das das ursprüngliche Material hat:

git checkout -b temp master 
    git rm -r Unneeded_stuff 
    git commit -m 'pruning' 

Dann können Sie diesen Zweig von einem Repository in ein ganz anderes (nicht verwandten) holen:

cd /path/to/other/repository 
    git fetch /path/to/source/repo temp:temp 

wo Temp: temp Mittel "hole die Temperatur von der Quelle und speichere sie als Temperatur hier". Von dort können Sie das Ergebnis in Ihren Master zusammenführen.

git merge temp 

Sie können dann die Temp Zweige löschen, da im ersten Fall ist es nicht etwas, das Sie jemals mit dem ursprünglichen Repo zusammenführen möchten, und im zweiten Fall haben Sie es verschmolzen.

Ich bin sicher, dass diese Schritte ein wenig komprimiert werden könnten, aber dieses Set scheint nett und klar.

+0

Entschuldigen Sie, dass Sie einen alten Post bekommen haben, aber das beantwortet eine nützliche, aber andere Frage als das OP. Könnten Sie ein neues q/a-Paar für diese Antwort erstellen? Es würde viel einfacher zu finden sein. – tacaswell

+0

und es wäre besser, die Filtermethode zu verwenden, um ein temporäres Repository zu erstellen, das nur die Dateien enthält, die verschoben werden sollen, und dann den Merge-Schritt des temporären Repositorys auszuführen, da dies die gesamte Historie des ursprünglichen Repos enthält. nur mit einem Löschschritt als letztes Commit). – tacaswell