Ответ 1
См. http://git-scm.com/docs/git-filter-branch
Я думаю, вам нужно что-то вроде
git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all
в клоне репозитория.
Предположим, что мой репозиторий git имеет следующую структуру:
/.git
/Project
/Project/SubProject-0
/Project/SubProject-1
/Project/SubProject-2
и в репозитории есть несколько коммитов. Теперь один из подпроектов (SubProject-0) становится довольно большим, и я хочу взять SubProject-0 и настроить его как автономный проект. Можно ли извлечь всю историю фиксации с помощью SubProject-0 из родительского репозитория git и перенести его на новый?
См. http://git-scm.com/docs/git-filter-branch
Я думаю, вам нужно что-то вроде
git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all
в клоне репозитория.
Мне нужно было сделать что-то подобное, но я хотел по существу переместить один подпроект из репо в другой. Вместо этого я использовал fetch, поскольку он может извлекать объекты из любого источника.
Итак, в основном, я создал новую ветку, удалил ненужный материал в этой ветке, а затем использовал git fetch, чтобы вытащить ветку с одного репо на другой. Как только у меня были объекты, слияние сделало трюк.
например.
В репозитории, в котором есть оригинальные материалы:
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 означает "выборка temp на источнике и сохранение здесь как temp здесь". Оттуда вы можете объединить результат с вашим хозяином.
git merge temp
Затем вы можете удалить ветки temp, так как в первом случае вы не хотите сливаться с исходным репо, а во втором случае вы его объединили.
Я уверен, что эти шаги могут быть сжаты немного, но этот набор кажется приятным и понятным.