Git SVN и слияние веток - PullRequest
       17

Git SVN и слияние веток

14 голосов
/ 27 ноября 2010

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

trunk
branches/foo

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

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

Ответы [ 3 ]

23 голосов
/ 27 ноября 2010

Создать псевдоним для команды извлечения:

git config alias.co checkout

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

git co master    # checkout branch that tracks subversion's trunk
git svn rebase 
git co local/foo # checkout branch that tracks subversion's 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
3 голосов
/ 27 ноября 2010

Существует способ выполнить слияние с git, но фиксация (upstream) с Subversion, который сложен в настройке, но эффективен (и намного проще, чем слияние с Subversion!) На практике.Во-первых, прочитайте обзор git + svn Дерика Бэйли , потому что вам нужно будет настроить git и SVN игнорировать файлы в соответствии с его указаниями.

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

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

  1. SVN Checkout /trunk/ в папку с рабочей копией;Я предполагаю, что это C:\trunk.
  2. git init репозиторий git в этой папке;настроить .gitignore;git add -A;git commit (см. git + svn выше).
  3. Создание клона git хранилища (в другой папке): git clone C:\trunk foo.Я предполагаю, что этот клон находится в C:\foo.
  4. Удалите все в C:\foo кроме подпапки .git, затем SVN Checkout /branches/foo в C:\foo.
  5. в 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 обратно в trunk.В C: \ trunk запустите git pull C:\foo.Это вытягивает и объединяет все изменения из папки C:\foo, которая является вашим git-репозиторием, отслеживающим ветку /branches/foo Subversion.При необходимости разрешите все конфликты и завершите коммит git.

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

0 голосов
/ 13 мая 2012

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

...