Разделение набора файлов в репозитории 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
Другие вопросы по тегам