Unter Git möchte man manchmal ein Verzeichnis von einem Repository zu einem anderen verschieben. Natürlich soll dabei die Revisionsgeschichte nicht verloren gehen. In diesem Fall hilft folgendes Bashskript:
#!/bin/sh # moves a folder from one git repository to another # moveFolder <absolute repository one path> <repository one folder> <absolute repository two path> # prepare repository one cd $1 git clean -f -d -x git checkout -b tmpBranch git filter-branch --subdirectory-filter $2 HEAD mkdir $2 mv * $2 git add . git commit -a -m "Move files into folder" #import in repository two cd $3 git remote add repositoryOne $1 git pull repositoryOne tmpBranch git remote rm repositoryOne #cleanup cd $1 git checkout master git branch -D tmpBranch #remove folder with history from repository one cd $1 git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch $2" HEAD
Genutzt wird das Skript dabei wie folgt:
./moveFolder /absolute/path/to/repo/one folderFromRepoOne /absolute/path/to/repo/two
Nachdem das Verzeichnis in das neue Repository mitsamt der Revisionsgeschichte übertragen wurde, wird es aus dem alten Repository entfernt. Das Skript funktioniert dabei unter Windows, Linux und Mac OS X. Die jeweils aktuellste Version ist auf GitHub zu finden.
Wenn man bereits Ordner verschoben hat, muss ich beim Befehl
git filter-branch –subdirectory-filter $2 HEAD
immer noch ein -f einbauen:
git filter-branch -f –subdirectory-filter $2 HEAD
sonst kriege ich die meldung, dass bereits ein Backup vorhanden ist