Ich habe ein Git-Repository geerbt, das mehrere Projekte in separaten Verzeichnissen enthält. Ich möchte das Repository in neue einzelne Repositorys aufteilen, eines für jedes Projekt, und dann das Master-Repository die Projekte als Submodule enthalten lassen. Ich möchte dies alles tun und dabei den Revisionsverlauf der einzelnen Projekte nach Möglichkeit beibehalten.
Ich könnte das Repository für jedes Projekt klonen und jedes Mal alle anderen Projekte entfernen, aber gibt es eine bessere Möglichkeit, den geklonten Verlauf in jedem neuen Projekt-Repository zu vermeiden?
git
git-submodules
Apfelwein
quelle
quelle
Antworten:
Mit können Sie
git filter-branch
den Verlauf eines Projekts neu schreiben. Aus der Dokumentation:Erstellen Sie mehrere Kopien Ihres Repos, tun Sie dies für jedes Unterverzeichnis, das Sie aufteilen möchten, und Sie sollten das finden, wonach Sie suchen.
quelle
--subdirectory-filter
. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
usw.--subdirectory
nimmt nicht mehrere Verzeichnisse an, kann jedoch mehrfach angegeben werden.foodir
im ursprünglichen Projekt beibehalten und den Verlauf nicht neu schreiben möchten ,git rm -r foodir
sollte dies nur ausreichen (dies löscht auch die Kopie in Ihrem Arbeitsbaum; wenn Sie dies nicht möchten, verwenden Sie--cached
). Wenn Sie es vollständig aus dem Verlauf entfernen möchten (auch die Frage von @ ilius beantworten), möchten Sie etwas wiegit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
Lösung schneller als die--tree-filter
, da sie die Dateien nicht auschecken muss, sondern nur den Index direkt bearbeiten kann. Die Verwendung--tree-filter
kann jedoch etwas einfacher sein, da Sie normale Dateisystemoperationen verwenden können, anstatt mit Indexmanipulationsoperationen arbeiten zu müssen.Um einen Ordner als neues Repository zu exportieren, benötigen Sie:
Öffnen Sie den geklonten Repository-Ordner und führen Sie den folgenden Befehl aus:
quelle
git subtree
ist nicht als Cygwin-Paket verfügbar. Wenn Sie es brauchen: stackoverflow.com/a/27116828/2484903Der Punkt von Git ist, dass der Verlauf in jedem Commit durch Hashing des übergeordneten Commits verkörpert wird. Sie können die Commits (so funktioniert der svn-Importer im Wesentlichen) in einem neuen Repository "wiedergeben" und nur jedes Unterprojekt behalten. Dies würde jedoch die Bedeutung der Commit-Hashes zerstören. Wenn Sie damit kein Problem haben, dann sei es so.
In der Vergangenheit habe ich es einfach geklont und bin weitergegangen. Dies macht die Dinge größer, aber der Speicherplatz ist billig; Meine Zeit ist teuer.
Ich kenne auch keine Tools zum Ausspleißen eines Verzeichnisses. Ich nehme an, Sie könnten sich im Verzeichnis anmelden, um alle Commits zu finden, und dann die Commits mit etwas wie git-fast-export wiedergeben.
quelle