Извлечь часть репозитория git?

Предположим, мой репозиторий git имеет следующую структуру:

/.git
/Project
/Project/SubProject-0
/Project/SubProject-1
/Project/SubProject-2

и в репозитории довольно много коммитов. Теперь один из подпроектов (SubProject-0) становится довольно большим, и я хочу выделить SubProject-0 и настроить его как отдельный проект. Можно ли извлечь всю историю коммитов с участием SubProject-0 из родительского репозитория git и переместить его в новый?


person Rio    schedule 29.03.2010    source источник
comment
Обратите внимание, что это дубликат stackoverflow.com / questions / 359424 / (как говорит Джим ДеЛаХант в своем ответе).   -  person Fabian Fagerholm    schedule 03.10.2012


Ответы (2)


См. http://git-scm.com/docs/git-filter-branch

Я думаю тебе нужно что-то вроде

git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all

в клоне репозитория.

person Christoffer Hammarström    schedule 29.03.2010
comment
@Rio Вы также можете использовать опцию --prune-empty для удаления коммитов, затронутых только Project/SubProject-0. - person Greg Bacon; 29.03.2010

Мне нужно было сделать что-то подобное, но я хотел по сути перенести один подпроект из репо в другой. Вместо этого я использовал выборку, поскольку она может извлекать объекты из любого источника.

Итак, по сути, я создал новую ветку, удалил ненужные вещи в этой ветке, а затем использовал git fetch, чтобы перетащить ветку из одного репо в другое. Когда у меня были объекты, слияние сделало свое дело.

E.g.

В репозитории с оригинальными материалами:

    git checkout -b temp master
    git rm -r Unneeded_stuff
    git commit -m 'pruning'

Затем вы можете получить эту ветку из одного репозитория в совершенно другой (не связанный):

    cd /path/to/other/repository
    git fetch /path/to/source/repo temp:temp

где temp: temp означает «получить временную температуру из источника и сохранить ее здесь как временную». Оттуда вы можете объединить результат в свой мастер.

    git merge temp

Затем вы можете удалить временные ветки, поскольку в первом случае это не то, что вы когда-либо хотели бы объединить с исходным репо, а во втором случае вы его объединили.

Я уверен, что эти шаги можно было бы немного сжать, но этот набор кажется красивым и понятным.

person Tony K.    schedule 28.06.2011
comment
Извините за ошибку по поводу старого сообщения, но это ответ на полезный, но отличный от OP вопрос. Не могли бы вы создать новую пару вопросов / ответов для этого ответа? Было бы намного проще найти. - person tacaswell; 18.02.2014
comment
и было бы лучше использовать метод фильтрации для создания временного репозитория, включающего только файлы, которые вы хотите переместить, а затем выполнить этап слияния временного репозитория, так как при этом по-прежнему сохраняется полная история исходного репозитория (просто с шагом удаления в качестве последней фиксации). - person tacaswell; 18.02.2014