Мой рабочий процесс git-svn выглядит примерно так:
(on master) git svn rebase
git checkout work
... make commits for all changes, including local-only and those I intend to push up
git checkout master
... cherry-pick changes from work branch
git svn dcommit
git checkout work
git rebase master
Последний шаг rebase
удаляет все коммиты из рабочей ветви, которые уже были зафиксированы в восходящем направлении.
Дляшаг cherry-pick
, на самом деле я использую небольшой скрипт оболочки, который автоматически получает все коммиты , за исключением те, которые имеют "NOCOMMIT" в своем описании.Вы можете использовать другой индикатор, такой как «LOCAL» или «NOPUSH» или любой другой.Это те коммиты, которые находятся в ветке «работа» и не передаются в Subversion.
Вот мой pull-work
скрипт:
#!/bin/sh
BRANCH=`git branch | grep ^\\* | cut -d' ' -f2`
if [ $BRANCH != "master" ]; then
echo "$0: Current branch is not master"
exit 1
fi
git log --pretty=oneline work...master | grep -v -E '(NOCOMMIT|DEBUG):' | cut -d' ' -f1 | tac | xargs -l git cherry-pick
Обратите внимание на использование таких тонкостей, какtac
, которые изменяют порядок перечисленных коммитов, поэтому они применяются к мастеру в том же порядке.