git-svn如何知道要dcommit到哪个分支?

21

我的版本管理系统是SVN,但我使用git进行所有的开发。我们有一个标准布局,我用git svn init -s <url to repo>初始化了本地repo。

以下是我的分支工作流程:

# creates a new branch remotely
git svn branch new-branch-name

# switches to a branch or trunk locally
git reset --hard name-of-branch
git reset --hard trunk

# merge changes from trunk into a branch
git reset —hard name-of-branch
git merge trunk
git svn dcommit

上述最后一个命令将提交更改到分支 name-of-branch。我的问题是,Git 是怎么知道的?当我执行 git reset --hard foo 时,具体会发生什么?

这可能只是关于 Git 的一般问题。每次我试图研究答案时,我都会对 svn 集成是否特殊情况感到困惑。

3个回答

13

git-svn会查找与活动的SVN分支相对应的祖先提交树(refs/remotes/...分支与SVN中的分支相对应),然后将它们提交到这些分支。

请注意,不应该合并再提交 -- SVN 和 Git 的分支模型不匹配,这种做法可能会破坏你的SVN历史记录。相反,当你在分支上时,应该使用git rebase trunk (或者 git svn rebase)。

此外,请注意,在执行rebase之前需要检出一个本地分支。如果没有,可以使用git checkout -b local-branch-to-create remote-branch创建一个本地分支,然后进行git rebase trunk操作。

如果您想将所有被rebase的提交压缩成一个,则可以在rebase之后执行以下命令:git reset --soft trunk && git commit

一旦您满意现在在主干上的提交,只需使用git svn dcommit将它们推送到SVN服务器即可。


1
这是因为你没有正确使用rebase。git checkout my-branch; git rebase trunk; git svn dcommit; - cdhowie
1
不,这不是... 我将 my-branch 视为本地主题分支,您在其中进行了开发,并将 trunk 视为远程 svn 主干引用的名称。 - cdhowie
1
我以为你正在尝试将你的分支合并到主干?my-branch 对应一个远程 SVN 分支吗? - cdhowie
1
很棒的答案。欲了解更多详情,请参阅Git Wiki上的以下页面 - https://git.wiki.kernel.org/index.php/GitTips#How_to_use_git_branches_with_git_svn - Matt Passell
1
@MattPassell:看起来链接已经失效了。SVN部分不再在那个维基页面中。您可以查看它发生的时间:https://git.wiki.kernel.org/index.php?title=GitTips&diff=21551&oldid=21231但是,那次编辑的评论提到该部分已移动到https://git.wiki.kernel.org/index.php/GitSvnClient。 - jgomo3
显示剩余10条评论

2

创建本地分支并跟踪远程svn分支,难道不是很简单吗? 当您执行git svn init --stdlayout svn仓库的url时,Git将下载整个svn仓库,并压缩它以便能够使用Git进行操作。

之后只需要像这样做:

git checkout -b mybranch -t remotes/mybranch

如果你有一个本地分支追踪一个远程分支,git svn dcommit 只会推送到被追踪的远程分支。

6
我尝试了这个命令 git svn dcommit -n,但它仍然显示将要提交到主干而不是我想要的分支。 - John Thompson
这并不容易:“Git通过查找您的历史记录中任何一个Subversion分支的末端来确定您的提交所属的分支 - 您应该只有一个,并且它应该是当前分支历史记录中具有git-svn-id的最后一个分支。” https://git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client#switching-active-branches-LPtGtkszIW - jgomo3

1

如果你想将git master提交到svn trunk,可以尝试以下命令:

git checkout master
git rebase trunk
git svn info # To verify that you're on the right branch
git svn dcommit

在另一个分支上同样如此(例如6.x)

git checkout 6.x
git rebase 6.x # or git rebase remotes/6.x
git svn info
git svn dcommit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接