Разделение набора файлов в репозитории git в свой репозиторий, сохранение соответствующей истории

Возможный дубликат:
Как разбить репозиторий git при сохранении подкаталогов?

В какой-то момент я добавил свой код в существующий репозиторий git, и с тех пор его довольно много посвятили, в то время как другой разработчик передал другие существующие файлы в репо. Теперь я хочу разделить мой код на свое собственное репо, но сохраните всю историю изменений для моих конкретных файлов.

Прочитав то, что другие сделали для разделения кода, я смотрел filter-branch и делал --index-filter или --tree-filter с помощью команд rm для файлов, которые мне не нужны. Я не хочу использовать --subdirectory-filter, поскольку он не подходит для subdir, в котором мой код является topdir (также мы разделили один subdir). Чтобы усложнить ситуацию, некоторые файлы из исходного репозитория со временем переместились со временем, и есть некоторые файлы, которые были созданы и удалены. Это немного упрощает разработку списка rm... сложный процесс.

Я ищу способ фильтровать все/кроме/список файлов/каталогов. Кто-нибудь знает, как это сделать?

Ответ 1

Просто, чтобы закрыть цикл, чтобы он отображался как ответ.

Используя index-filter или tree-filter, а затем применяя обратную логику, например, git ls-tree, переданную в (несколько) grep -v, отправленную в xargs для git rm, вы действительно можете удалить все, что не соответствует узкому набор имен файлов/каталогов. Вот команда, которую я использовал для разделения моих файлов:

git filter-branch \
    --prune-empty \
    --index-filter '
        git ls-tree -z -r --name-only --full-tree $GIT_COMMIT \
        | grep -z -v "^src/pyfedpkg$" \
        | grep -z -v "^src/fedpkg" \
        | grep -z -v "^git-changelog" \
        | xargs -0 -r git rm --cached -r
    ' \
    -- \
    --all