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