Обратите внимание, что все становится намного проще, если вы комбинируете это с дополнительным этапом перемещения нужного файла (ов) в новый каталог.
Это может быть довольно распространенным вариантом использования (например, перемещение нужного сингла).файл в корневой каталог).
Я сделал это (используя git 1.9) примерно так (сначала переместив файл (ы), затем удалив старое дерево):
git filter-branch -f --tree-filter 'mkdir -p new_path && git mv -k -f old_path/to/file new_path/'
git filter-branch -f --prune-empty --index-filter 'git rm -r --cached --ignore-unmatch old_path'
Вы можете даже легко использоватьподстановочные знаки для нужных файлов (без возни с grep -v).
Я думаю, что это ('mv' и 'rm') также может быть сделано в одной ветви-фильтра, но это не такработать для меня.
Я не пробовал это с странными персонажами, но я надеюсь, что это все равно поможет.Делать вещи проще, мне всегда кажется хорошей идеей.
Подсказка:
Это длительное действие на больших репозиториях.Поэтому, если вы хотите выполнить несколько действий (например, получить кучу файлов, а затем переставить их в 'new_path / subdirs'), неплохо было бы выполнить часть 'rm' как можно скорее, чтобы получить меньшее и более быстрое дерево.