Git фильтр подкаталогов с существующей структурой каталогов
Я разбиваю репозиторий Git, используя опцию -subdirectory-filter для ветки фильтра, которая отлично работает, за исключением того, что она тянет все до корня репозитория.
В настоящее время у меня
ABC
- DEF
- GHI
- JKL
- MNO
И результат этой команды:
git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all
Генерирует это:
GHI
JKL
Где я действительно хочу это:
ABC
- DEF
- GHI
- JKL
Я не вижу ничего в документах Git, которые показывают параметр фильтра, который сохраняет (или устанавливает) структуру каталогов, и я не смог найти команду, которую я могу запустить после фильтрации, чтобы переназначить структуру как я этого хочу.
Возможно ли это?
Ответы
Ответ 1
Я нашел ответ здесь, который делает трюк.
Команда:
git filter-branch -f --index-filter 'git ls-files -s \
| sed "s-\t-&ABC/DEF/-" \
| GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \
&& mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE'
отлично работает
Ответ 2
Я просто дал это поверхностное тестирование самостоятельно, но я думаю, вы можете использовать git filter-branch
с --tree-filter
для перезаписи ветки, но удаление всех файлов, кроме тех, что находятся в подкаталоге ABC/DEF
, с чем-то вроде следующего
git filter-branch --tree-filter \
'find . -path ./ABC/DEF -prune -o -type f -print0 | xargs -0 rm -f' \
--prune-empty HEAD
Обратите внимание, что команда find
удаляет только файлы, а не каталоги, но поскольку git не хранит пустые каталоги, это все равно приведет к желаемому результату.