我最近一直在使用 git-svn 通过 git 管理旧的 svn 存储库。
我最近在我创建的一个分支中工作,如下所示:
git checkout -b local-branch svn-branch
此后我一直在该分支工作并使用以下方式提交回 svn 分支:
git svn dcommit
现在是时候将本地分支 merge 回主分支了,我尝试执行以下操作:
git checkout master
git merge local-branch
到目前为止,一切都很好。现在我想将 merge 提交回 subversion,所以我尝试这样做:
git svn dcommit
但是,现在我的主人正在提交回 svn-branch 分支,而不是我所期望的主干。有什么我错过的吗,或者这种 merge 不建议像这样在 svn 分支之间 merge ?
作为旁注,我改为通过 svn 进行 merge ,但我想尽可能避免使用 svn。处理这个问题的首选方法是什么?
最佳答案
git svn dcommit
始终将更改发送到 git-svn-id 签名中指定的 url,该签名是 HEAD 历史记录中第一父提交链的最新版本。
我想,您的 merge 是快进的(即可以从 local-branch/svn-branch 访问主引用),因此它只是通过“git merge”设置为 local-branch,而不是 merge 提交创建。
建议始终使用 --no-ff 选项和“git merge”,因为 Subversion 没有快进 merge 这样的概念。 (您可以在 config 中将此选项 (merge.ff=true
) 设置为默认值 [ 或将 branch.master.mergeoptions
设置为 Git 的“--no-ff” < 1.7.6] 但请注意,如果您使用超过 1 个 Remote ,“git pull”也将变得非快进)
为了避免 SVN 和/或 git-svn:如果您有权访问存储库服务器,您可以查看 SubGit为 Subversion 提供纯 Git(不是 git-svn)接口(interface)的项目。即使在 SubGit 的情况下,也强烈建议使用 --no-ff 选项,因为快进 merge (和快进 rebase )无法与另一个提交的分支删除和重新创建区分开来(对于任何 Git<->SVN 翻译都是如此)工具)。
但也许任何其他原因(我不知道任何其他原因)导致最新提交消息中带有分支 URL(而不是主干 URL)的“git-svn-id”。无论如何,请确保 master 指向正确的提交。
关于Git-svn merge 和提交分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605767/