2009-10-20 3 views
27

Ich habe dieses Git-Repository, das zwei Ordner enthält: binary-search und poker. Zum Beispiel http://github.com/soulnafein/code-katasSo machen Sie einen Teil eines vorhandenen GIT-Repository ein Submodul

Ich möchte diese Ordner zu Submodulen machen und ihre Änderungshistorie behalten.

Wie kann ich das tun?

+1

mögliche Duplikate von [Wie extrahiere ich ein git-Unterverzeichnis und mache daraus ein Submodul?] (Http://stackoverflow.com/questions/920165/howto-extract-a-git-subdirectory-and-make-a- Submodul-Out-of-It) –

+0

mögliches Duplikat von [Unterverzeichnis trennen in separates Git-Repository] (http: // stackoverflow.com/questions/359424/detach-Unterverzeichnis-in-separate-git-repository) –

Antwort

14

Die allgemeine Idee ist, zu verwenden "git filter-branch' und die folgenden Schritte:

1) Erstellen Sie ein Modul mit --subdirectory-Filter von filter-branch (nach dem Repo-Klonen).

$ git filter-branch --subdirectory-filter ABC HEAD -- --all 

Weitere Informationen zu diesem Schritt finden Sie unter SO question.

2) Erstellen Sie ein Superprojekt mit einem Indexfilter von filter-branch, um das Submodul zu löschen.

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD 

3) Übernehmen Sie das Submodul mit der neuesten Version des Superprojekts.

Siehe Detach subdirectory into separate git repository für ein praktisches Beispiel.

Jedes Submodul behält seine Historie.
Aber die, wie in diesem patch proposal, wäre es:

verlieren alle historischen Verbindungen zwischen dem Superproject und das Submodul, Tools wie ‚git bisect‘ zu brechen, und macht es schwierig, alte Versionen zu erholen.

Idealerweise jede Version des neu geschaffenen Superproject würde auf die korrekte Version des Submoduls verbunden werden (und alle .gitmodules Einträge korrekt eingerichtet werden würde, auch in der Geschichte der Projekt)

Wenn Sie benötigen keine vorherige Historie, die mit den neuen Submodulen verknüpft ist. Sie können die oben genannten Schritte ausführen.
Aber wenn Sie von einem älteren Punkt abzweigen müssen, während Sie Referenzen auf Ihre Submodule haben (die derzeit einfache Unterverzeichnisse sind), könnten Sie das Skript in dem Patch, auf das ich mich beziehe, verwenden. Es wird in this thread diskutiert, aber zu Git noch integriert, wie Junio ​​C Hamano sagt:

Leider, ich glaube nicht, dass wir voll entwickelt haben (noch überhaupt implementiert) Verhalten verschiedene Punkte der Geschichte zu überprüfen, die hat Das gleiche Submodul bewegte sich im Superprojektbaum.

14

Heute gibt es einen besseren Weg, dies zu tun: git subtree

this answer See.

+0

Offenbar wurde ['git subtree' in mainline git zusammengeführt] (https://github.com/apenwarr/git-subtree/blob/master/THIS-REPO-IS-OBSOLETE) ab Version 1.7.11. – donut

Verwandte Themen