我正在开发一个带有两个分支的svn项目,让我们调用它们
trunk
branches/foo
我的想法是克隆整个svn存储库(告诉git哪个文件夹是主干,标签和分支),在git中进行合并,然后将我的合并复制到svn工作副本并从svn提交更改。
在这个工作流程中,我是否可以使用gits合并功能,还是仅适用于使用git创建的分支?
答案 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的历史记录。
然后,基本步骤如下:
/trunk/
到工作副本文件夹;我假设它是C:\trunk
。git init
该文件夹中的git存储库;设置.gitignore
; git add -A
; git commit
(见上文git+svn)。git clone C:\trunk foo
。我假设此克隆位于C:\foo
。C:\foo
除.git
子文件夹以外的所有内容,然后删除/branches/foo
中的SVN Checkout C:\foo
。git add -A; git commit
将分支上的更改保存到git存储库。这会创建与C:\ trunk中的历史记录不同的初始git历史记录。我们现在有两个文件夹,它们都是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
文件夹中的所有更改,该文件夹是跟踪/branches/foo
Subversion分支的git存储库。如有必要,解决所有冲突并完成git提交。
您现在可以将C:\ trunk中的更改提交到Subversion,而无需使用Subversion来执行合并。
答案 2 :(得分:-1)
我建议你使用SmartGit作为你的SVN项目。它非常好地支持cherry-picking合并和完全合并,正确修改svn:mergeinfo。