Подтвердить что ты не робот

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, которые показывают параметр фильтра, который сохраняет (или устанавливает) структуру каталогов, и я не смог найти команду, которую я могу запустить после фильтрации, чтобы переназначить структуру как я этого хочу.

Возможно ли это?

4b9b3361

Ответ 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 не хранит пустые каталоги, это все равно приведет к желаемому результату.