我正在处理一个有两个分支的svn项目,让我们称之为
trunk
branches/foo
我的想法是克隆整个svn仓库(告诉git哪些文件夹是主干、标签和分支),在git中进行合并,然后将我的合并结果复制到svn工作副本并从svn提交更改。
在这个工作流程中,我能否使用git的合并功能,还是只能用于由git自身创建的分支?
为 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
git merge merging_branch_foo
可以实现这一点吗?我不这么认为。 - QZHua/trunk/
SVN Checkout 到一个工作副本文件夹中;我假设它是 C:\trunk
。git init
一个 git 存储库;设置 .gitignore
;git add -A
;git commit
(请参阅上面的 git+svn)。git clone C:\trunk foo
。我假设这个克隆位于 C:\foo
中。C:\foo
中除了 .git
子文件夹之外的所有内容,然后在 C:\foo
中 SVN Checkout /branches/foo
。git add -A; git commit
将更改保存到 git 存储库中。这将创建初始 git 历史记录,该历史记录与 C:\trunk 中的历史记录分歧。C:\trunk
和 C:\foo
文件夹中执行工作(或只需使用 svn update
获取其他人的工作)。定期运行 git add -A; git commit
将更改保存到您的 git 存储库中。
现在你想将foo分支合并回主干。在C:\trunk目录下,运行git pull C:\foo
命令。这将拉取并合并C:\foo
文件夹中的所有更改,该文件夹是跟踪/branches/foo
Subversion分支的git存储库。如果必要,解决任何冲突并完成git提交。
现在你可以提交C:\trunk中的更改到Subversion,而无需使用Subversion执行合并操作。
branches/foo
代码的git分支,可以利用git的历史知识执行多次合并(从分支到主干),并避免通常由Subversion在此场景下生成的冲突。此外,git必须知道一个共同的祖先--你不能只告诉它合并两个文件夹。 - Bradley Grainger