Git SVN и слияние ветвей

Я работаю над проектом svn с двумя ветвями, позвонил им

trunk
branches/foo

Моя идея - клонировать весь репозиторий svn (сообщая git, какая папка является стволом, тегами и ветвями), выполните слияние в git, а затем скопируйте мое слияние в рабочую копию svn и зафиксируйте изменения из svn.

В этом рабочем процессе смогу ли я использовать силу слияния gits или будет работать только для ветвей, созданных самим git?

Ответ 1

Создайте псевдоним команды checkout:

git config alias.co checkout

Убедитесь, что локальные ветки обновлены:

git co master    # checkout branch that tracks subversion trunk
git svn rebase 
git co local/foo # checkout branch that tracks subversion branches/foo
                 # It assumes that  the branch is created with the command:
                 # `git co -b local/foo remotes/foo`
                 # And the repo was created with:
                 # `git svn clone --stdlayout SVN_REPO_URL`
git svn rebase 

Объединить ветки:

# create new local branch based on `master`
git co master
git co -b merging_branch_foo 
# merge, resolve conflicts, etc (pure git)
git merge local/foo  

# rebase `merging_branch_foo` to linearize history for subversion
git rebase master # or `rebase -i`

# merge `merging_branch_foo` into `master`
git co master
git merge merging_branch_foo # --squash to create single commit

# commit changes to svn
git svn dcommit

# (optionally) delete `merging_branch_foo`
git branch -D merging_branch_foo

Ответ 2

Существует способ выполнить слияние с git, но совершать (вверх по течению) с Subversion, которые сложно настроить, но на практике (и намного проще, чем слияние с Subversion!). Сначала прочитайте Derick Bailey git + svn overview, потому что вам нужно будет настроить файлы игнорирования git и SVN, как он инструктирует.

Обратите внимание, что это не использует стандартный пакет git -svn, но реплицирует многое из того, что делает, вручную. Если вы уже используете git -svn, не используйте этот метод. Кроме того, стоит использовать этот метод только в том случае, если вы будете многократно сливаться с веткой на туловище (и особенно, если вишня выбирается из ствола в ветку), поскольку она использует историю git при выполнении дополнительных слияний.

Затем основные шаги заключаются в следующем:

  • SVN Checkout /trunk/ в папку рабочей копии; Я предполагаю, что это C:\trunk.
  • git init репозиторий git в этой папке; настроить .gitignore; git add -A; git commit (см. git + svn выше).
  • Создайте клон git репозитория (в другой папке): git clone C:\trunk foo. Я предполагаю, что этот клон находится в C:\foo.
  • Удалить все в C:\foo, кроме подпапки .git, затем SVN Checkout /branches/foo в C:\foo.
  • В C:\foo запустите git add -A; git commit, чтобы сохранить изменения в ветке в репозитории git. Это создает начальную историю git, которая расходится с историей в C:\trunk.

Теперь у нас есть две папки, которые являются git репозиториями и рабочими копиями Subversion; Кроме того, git считает, что папки являются клонами одного и того же репозитория.

Выполняйте работу в папках C:\trunk и C:\foo (или просто svn update, чтобы заставить работать другие). Периодически запустите git add -A; git commit, чтобы сохранить изменения в репозиториях git.

Теперь вы хотите объединить ветвь foo обратно в багажник. В C:\trunk запустите git pull C:\foo. Это втягивает и объединяет все изменения из папки C:\foo, которая представляет собой ваш репозиторий git, отслеживающий ветвь Subversion /branches/foo. При необходимости разрешите любые конфликты и завершите фиксацию git.

Теперь вы можете зафиксировать изменения в C:\trunk для Subversion, не используя Subversion для выполнения слияния.

Ответ 3

Я бы рекомендовал вам использовать SmartGit для вашего проекта SVN. Он имеет очень хорошую поддержку как для слияния вишни, так и для полного слияния, правильно изменяя svn: mergeinfo.