Git-Repository auftrennen

Im Verlauf eines Projektes kann es sinnvoll sein, gewachsene Repository-Strukturen aufzuräumen und einzelne Teile als eigenständige Repos herauszutrennen.

Für einen derartigen Split hält Git die Option „filter-branch“ bereit.

Hinweis: Vor Beginn der Operation sollte es selbstverständlich sein, geeignete Backups des Repositories zu haben. Und: Alles auf eigene Gefahr! 😉

Anhand eines Beispiels wird das ganze etwas deutlicher:

Nennen wir das ursprüngliche Repo „Original“, darin befindlich verschiedene Dateien sowie zwei Verzeichnisse „Sub1“ und „Sub2“, jeweils auch mit Dateien oder Verzeichnissen gefüllt.

Ziel ist, ein neues Repo zu erstellen, das nur „Sub1“ beinhaltet und übrigen Ballast abwirft.

Dazu – um das originale Repo zu erhalten – klonen wir das Repo zunächst an eine andere Stelle, z.B. „Kopie“. Auch hier sind damit die entsprechenden Dateien und Verzeichnisse des Originals enthalten. (Auch bei mehreren Branches.)

Im Verzeichnis „Kopie“ wird dann z.B. in der Kommandozeile folgendes Git-Kommando ausgeführt:

git filter-branch --subdirectory-filter Sub1 --prune-empty -- --all

Was sagt der Befehl? „filter-branch“ ist für das umschreiben des Versionsverlaufs zuständig und die beiden zugehörigen Optionen „subdirectory-filter“ und „prune-empty“ filtern die Commits auf ein Unterverzeichnis (hier „Sub1“) bzw. ignorieren leere Commits. Die letzte Angabe „all“ bezieht sich (durch die beiden Striche ohne Option vorher) auf git und gibt an, dass alle Branches gefiltert werden sollen.

Das Ergebnis ist wie gewünscht: Am Ende befinden sich im Ordner „Kopie“, also dem obersten Verzeichnis des kopierten Repositories, die Dateien, die vorher im Ordner „Sub1“ waren, alle anderen Dateien und Verzeichnisse wurden entfernt.

Hinweis: Das neue Repo ist nach der Operation nicht mehr ohne weiteres mit dem ursprünglichen kompatibel.

Noch ein Hinweis: Git macht bei filter-branch auch intern ein Backup, d.h. die Größe des Verzeichnisses auf dem Datenträger wird noch nicht unmittelbar kleiner. Dazu ist eine Möglichkeit, das Repo zu klonen: Im Klon ist das interne Backup nicht mehr enthalten. Außerdem bietet sich an, den Garbage Collector aufzurufen.

Quellen: Git-Manual, GitHub Help

Leave a Reply

Your email address will not be published. Required fields are marked *