Похоже, вы хотите одну историю, содержащую все изменения файлов в двух папках. Вы не можете сделать это с --directory-filter
, но вы все равно можете использовать filter-branch
с --index-filter
.
git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch -- :/:* :/!:Folder-1 :/!:Folder-2` --prune-empty -- --all
Использование git rm
в качестве index-filter
создает новый коммит из каждого оригинала Коммит, загружая исходный коммит в индекс, удаляя некоторые файлы и фиксируя новый индекс.
Каждый из параметров :/!:...
говорит git rm
не удалять именованную папку и ее содержимое, и :/:*
приказывает удалить все остальное.
Опция --prune-empty
удаляет из новой истории любые коммиты, которые изменяли только файлы вне ваших папок - потому что они выглядели бы так, как будто они ничего не делали в новой история. Вы можете опустить эту опцию, если хотите сохранить эти коммиты в любом случае.
Вышеуказанные файлы сохраняются в их исходных каталогах. Если вы хотите что-то другое, вам может потребоваться использовать --tree-filter
вместо --index-filter
. Эта опция значительно медленнее (особенно если репо велико), но проще вносить более сложные изменения (потому что сценарий фильтра просто должен работать с файлами на диске, а не напрямую преобразовывать индекс).
Тем не менее, с недавних пор в документации не рекомендуется использовать filter-branch
. Я еще не знаком с инструментом, который они предлагают вместо этого.
Итак, вот filter-branch
документы, из которых вы можете либо следовать предупреждению и найти другой инструмент, либо узнать больше о вышеописанной процедуре: https://git-scm.com/docs/git-filter-branch