Git SVN和合并分支

时间:2010-11-27 09:04:46

标签: svn git git-svn

我正在开发一个带有两个分支的svn项目,让我们调用它们

trunk
branches/foo

我的想法是克隆整个svn存储库(告诉git哪个文件夹是主干,标签和分支),在git中进行合并,然后将我的合并复制到svn工作副本并从svn提交更改。

在这个工作流程中,我是否可以使用gits合并功能,还是仅适用于使用git创建的分支?

3 个答案:

答案 0 :(得分:23)

为checkout命令创建别名:

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

答案 1 :(得分:3)

有一种方法可以执行与git的合并,但是使用Subversion提交(上游)设置很复杂,但实际上功能强大(并且比使用Subversion合并要容易得多!)。首先,阅读Derick Bailey的git+svn overview,因为你需要按照他的指示设置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子文件夹以外的所有内容,然后删除/branches/foo中的SVN Checkout C:\foo
  5. 在C:\ foo中,运行git add -A; git commit将分支上的更改保存到git存储库。这会创建与C:\ trunk中的历史记录不同的初始git历史记录。
  6. 我们现在有两个文件夹,它们都是git存储库和Subversion工作副本;另外,git认为这些文件夹是同一个存储库的克隆。

    C:\trunkC:\foo文件夹(或只是svn update)中执行工作以获得其他人的工作。定期运行git add -A; git commit以保存对git存储库的更改。

    现在你想将foo分支合并回trunk。在C:\ trunk中,运行git pull C:\foo。这将引入并合并C:\foo文件夹中的所有更改,该文件夹是跟踪/branches/foo Subversion分支的git存储库。如有必要,解决所有冲突并完成git提交。

    您现在可以将C:\ trunk中的更改提交到Subversion,而无需使用Subversion来执行合并。

答案 2 :(得分:-1)

我建议你使用SmartGit作为你的SVN项目。它非常好地支持cherry-picking合并和完全合并,正确修改svn:mergeinfo。