У нас есть настройка SVN со стабильной магистралью и нестабильной веткой разработки. Работа разработчика (в основном) выполняется на ветви и затем объединяется с транком перед развертыванием.
Я использую git-svn в качестве клиента SVN. Мой процесс слияния от нестабильного к транку выглядит следующим образом:
git svn fetch
git co -b trunk svn/trunk
git merge --no-ff svn/unstable
git svn dcommit
svn/*
- это удаленные ветви SVN.
Это, конечно, требует, чтобы никто не передавал что-либо в транк до того, как я это сделал, но на практике это не проблема.
Преимущества этого процесса в том, что git теперь записывает родителей коммита слияния в моем локальном репозитории. Это не приносит пользы моим коллегам, но позволяет git вычислять общего предка, когда I выполняет слияние. Это очень желательно.
А вот и руб. Когда кто-то делает слияние, git не знает об этом. Вот пример:
o-...-A---o---C--- unstable
/
X--...--B---o---o--- stable
Нестабильная ветвь была создана в точке X. В точке A мы решили объединить изменения из нестабильной ветки в устойчивую ветвь в точке B. Общий предок - это правильно X.
Поскольку слияние не записано в истории git, следующее слияние в C снова предполагает, что X является общим предком. Я хотел бы, чтобы это было A, как на следующем графике:
o-...-A---o---C--- unstable
/ \
X---...---B---o---o--- stable
Нет необходимости в том, чтобы получить график, который выглядит точно так же, как изображенный. Любой график, который распознал бы А как общего предка, мне подходит.
Я имею в виду некоторые параметры, такие как правильное использование git-filter-branch или "фальшивый" коммит, который никогда не передается в SVN. Однако ни одна из моих попыток пока не сработала.
Я благодарен за любые идеи, которые вы можете представить. Процедура не должна быть автоматической. Слияния довольно редки, и я могу жить с болью, когда делаю это «вручную».