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

时间:2010-11-12 19:40:44

标签: svn git git-svn

我的回购是SVN,我用git进行所有开发。我们有一个标准的布局,并用git svn init -s <url to 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 个答案:

答案 0 :(得分:11)

git-svn将查找与活动SVN分支(与SVN中的分支对应的refs/remotes/...分支)对应的祖先提交的提交树。然后它会向那些人提出。

请注意,您不应该合并然后再提交 - SVN和Git的分支模型不匹配,这种事情可能会影响您的SVN历史记录。当你在分支机构时,你应该git rebase trunk。 (或者,git svn rebase。)

另外,请注意您在rebase之前签出的分支应该是本地分支。如果不是,您可以使用git checkout -b local-branch-to-create remote-branch创建一个。然后是git rebase trunk

如果您想将所有已重新提交的提交压缩为一个,请在rebase之后执行此操作:git reset --soft trunk && git commit

如果您对现在位于主干之上的提交感到满意,只需git svn dcommit将它们推送到SVN服务器。

答案 1 :(得分:2)

是不是像创建本地分支和跟踪远程svn分支一样简单? 当你执行git svn init --stdlayout url-of-svn-repo时,git会关闭整个svn repo,将其压缩以便可以使用git进行操作。

之后,事实上只做了以下事情:

git checkout -b mybranch -t remotes/mybranch

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

答案 2 :(得分: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