Фильтр подкаталогов Git с существующей структурой каталогов - PullRequest
13 голосов
/ 12 сентября 2011

Я разделяю Git-репозиторий, используя опцию --subdirectory-filter для filter-branch, которая отлично работает, за исключением того, что она вытягивает все до корня хранилища.

У меня сейчас есть

ABC
  - DEF
      - GHI
      - JKL
  - MNO

И результат этой команды:

git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all

Создает это:

GHI
JKL

Где то, что я действительно хочу, это:

ABC
  - DEF
      - GHI
      - JKL

Я не вижу ничего в Git docs, где показана опция фильтра, которая сохраняет (или устанавливает) структуру каталогов, и мне не удалось найти команду, которую я могу запустить после фильтрации переназначить структуру так, как я хочу.

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

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Я нашел ответ здесь , который делает трюк.

Команда:

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 голосов
/ 12 сентября 2011

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

...