2017-08-11 1 views
0

Ich versuche, einige Dateien zwischen zwei Git-Repositories repo1 und repo2 zu verschieben. Ich habe eine kurze Liste von Dateien, die ich verschieben möchte (Historie beibehalten).Verlauf für alles außer einer Liste von Dateien mit Git Filter-Zweig entfernen

libraryname/file1 
libraryname/file2 
tests/libraryname/file3 

Es gibt auch andere Dateien in libraryname/ und tests/libraryname/:

Drei Dateien von repo1 zu bewegen. Es gibt auch andere Ordner in / und tests/

Mein Plan ist repo1 zur Kasse, dann ändern Sie die Geschichte Baum, bis es nur die Geschichte für die Dateien enthält Ich habe Interesse an. Dann Kasse repo2 und verschmelzen in der Ausgabe der vorherigen Betrieb. Es scheint wie git filter-branch ist das richtige Werkzeug für den ersten Schritt.

Bisher habe ich versucht git filter-branch --index-filter 'git rm -r --cached <FILES>' Wo <FILES> listet alle unerwünschte ganze Ordner oder Datei.

Aber das hinterlässt eine Menge von Ordnern, die nicht mehr bei HEAD existieren, aber irgendwann in dieser Repository-Lebensdauer existiert haben. Es scheint ziemlich mühsam, alles herauszufinden, was in der Geschichte dieses Repos existiert hat - es muss einen besseren Weg geben

Wie bekomme ich am Ende einen git commit tree, der nur diese drei Dateien enthält? Gibt es einen besseren Weg als ich vorschlage? Oder gibt es eine Möglichkeit, Spuren aller Dateien zu entfernen, die derzeit nicht unter HEAD existieren?

Antwort

2

Sie sagten, es hinterlässt Ordner; Ich nehme an, Sie meinen es hinter Dateien lässt in diese Ordner (weil git nicht leere Ordner erhalten) ...

Es scheint, wie Sie den Ansatz des Löschens des Index nehmen möchten und dann erneut Hinzufügen des Einträge, die Sie wünschen.

git filter-branch ... 
    --index-filter 'git rm -r --cached * && git reset $GIT_COMMIT -- libraryname/file1 libraryname/file2 tests/libraryname/file3 
    ... 

Da Sie Ausdünnung sich die Inhalte so viel, vergessen Sie nicht, dass Sie

eine --prune-empty Option, um meine wollen
Verwandte Themen