Git создает новую ветку только с указанным каталогом и его историей, а затем отправляет в новый репозиторий - PullRequest
10 голосов
/ 02 апреля 2012

Я хотел бы создать новую ветку в моем репо, которая включает в себя файлы только из определенного каталога в master и его истории , а затем перенести эту ветку в новый репозиторий.

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

Пока что я думаю, что следующее будет работать, но мне интересно, есть ли более обтекаемый путь.

1 - Создать пустую ветку:

git symbolic-ref HEAD refs/heads/<new-branch>
rm .git/index 
git clean -fdx

2 - извлечение каталога из мастера:

git checkout master <paths> ...
git add <paths> ...
git commit

3 - Переместить ветку на новый пульт:

git push -u <remote-URL> <new-branch>

4 - Затем в новом репо объединить ветку с мастером:

git checkout -t origin/<new-branch>
git checkout master
git merge <new-branch>
git branch -d afterimage
git branch -d -r afterimage

Я пытаюсь сделать что-то эквивалентное Отсоединить подкаталог в отдельный репозиторий Git , но без git filter-branch mess.

1 Ответ

18 голосов
/ 01 июля 2015

Почему вы не хотите использовать git filter-branch?Он создан специально для таких задач, как вы.

git branch subdir_branch HEAD
git filter-branch --subdirectory-filter dir/to/filter -- subdir_branch
git push git://.../new_repo.git subdir_branch:master

Это даст вам только содержимое вашего dir/to/filter в новом хранилище, включая всю его историю и ничего более.Поскольку вы будете фильтровать только недавно созданную ветку, остальная часть вашего хранилища останется нетронутой.Вы можете удалить subdir_branch впоследствии.

...