111 Stimmen

Wie kann ich ein einzelnes Verzeichnis aus einem Git-Repository in ein neues Repository verschieben und dabei den Verlauf beibehalten?

Ich habe ein Git-Repository geerbt, das mehrere Projekte in separaten Verzeichnissen enthält. Ich möchte das Repository in neue individuelle Repositories aufteilen, eines für jedes Projekt, und das Master-Repository soll dann die Projekte als Submodule enthalten. Ich möchte das alles möglichst unter Beibehaltung der Revisionshistorie der einzelnen Projekte tun.

Ich könnte das Repository für jedes Projekt klonen und alle anderen Projekte jedes Mal entfernen, aber gibt es einen besseren Weg, um zu vermeiden, dass der geklonte Verlauf in jedem neuen Projekt-Repository vorhanden ist?

100voto

Brian Campbell Punkte 304982

Sie können verwenden git filter-branch die Geschichte eines Projekts neu zu schreiben. Aus der Dokumentation:

Um das Repository so umzuschreiben, dass es aussieht wie als ob foodir/ sein Projekt Root gewesen wäre, und alle anderen Historien zu verwerfen:

git filter-branch --subdirectory-filter foodir -- --all

Legen Sie mehrere Kopien Ihres Repos an, machen Sie das für jedes Unterverzeichnis, das Sie aufteilen wollen, und Sie sollten am Ende das haben, wonach Sie suchen.

4voto

user Punkte 7158

Um einen Ordner als neues Repository zu exportieren, benötigen Sie:

  1. So klonen Sie das Repository, in dem sich der zu exportierende Ordner befindet.
  2. Erstellen eines leeren Repositorys auf Ihrem Hosting-Anbieter wie GitHub, um den exportierten Ordner zu speichern.
  3. Öffnen Sie den Ordner des geklonten Repositorys und führen Sie diesen Befehl aus:

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master

2voto

Colin Burnett Punkte 10609

Der Sinn von Git ist, dass die Historie in jedem Commit enthalten ist, indem der übergeordnete Commit gehasht wird. Sie könnten die Commits in ein neues Repository "zurückspielen" (so funktioniert im Wesentlichen der svn-importer) und nur jedes Unterprojekt behalten. Dies würde jedoch die Bedeutung der Commit-Hashes zerstören. Wenn Sie kein Problem damit haben, dann soll es so sein.

In der Vergangenheit habe ich sie einfach geklont und weitergemacht. Das macht alles größer, aber Speicherplatz ist billig, meine Zeit ist teuer.

Ich kenne auch keine Werkzeuge, mit denen man ein Verzeichnis ausspleißen kann. Ich nehme an, Sie könnten git-log auf das Verzeichnis anwenden, um alle Commits darin zu finden und dann die Commits mit etwas wie git-fast-export wiedergeben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X