Git-Svn dcommit导致分支分裂

时间:2011-04-08 13:36:46

标签: svn git git-svn

我遇到git-svn dcommits的问题,导致git存储库无法跟踪哪些提交。

我尝试确保git中的master分支始终跟在SVN存储库中的trunk中。所以,每当我工作,我都在一个主题分支。这是我的情景:

在主题分支中工作一段时间

git checkout -b my-topic
git commit -m "blah blah blah"

然后我决定将我的分支合并回主人

git checkout master
git svn rebase #get any changes in svn
git rebase master my-topic
git merge my-topic --ff-only

直到这里,一切都进展顺利。我现在有主人和我的主题加速并指向相同的提交,整个历史记录如下:

A -- B -- C - master + my-topic

但是,当我这样做时

git svn dcommit

我最终得到一棵看起来像这样的树(B和C是我最初对该主题做出的提交):

  -- B -- C - my-topic
 /
A -- B -- C - master + remotes/trunk

似乎在dcommit过程中,git将提交推送到SVN,然后在master上重放它们。我认为问题是他们得到不同的提交者信息。我正在使用tortoise plink和SSH密钥登录svn。

在未被推送到SVN的git存储库中提交的提交者信息为:

Collin Hockey <chockey@xyz.com>

已经推送到svn存储库的提交有这个:但

chockey <chockey@6206317d-b652-48a9-a948-4036602fc523>

有什么办法可以防止这些分支分裂吗?我可以通过说

来解决它
git rebase master my-topic

再次,但我觉得这应该是不必要的。这个问题的主要问题是,一旦分支的更改被推送到SVN,git就不再认为分支已被合并到任何地方。删除不再需要的旧分支会让人感到困惑。

2 个答案:

答案 0 :(得分:10)

git svn dcommit命令的工作原理如下:

  1. 查找来自SVN的最后一次提交;我们称之为last-svn
  2. last-svn..HEAD范围内的提交发送给Subversion(顺便丢弃电子邮件)
  3. HEAD重置为last-svn
  4. 从SVN更新并创建相应的提交
  5. 换句话说,您发送到SVN的提交将从SVN的更新中销毁并重新创建。这必须发生,因为来自SVN的提交与使用Git创建的提交不同:

    • 他们的描述包含对SVN修订的引用
    • 他们的作者电子邮件是根据SVN用户名
    • 计算的

    这就是您的分支my-topicmaster不同的原因。

    您可以使用git svn dcommit--authors-file选项自定义--authors-prog从SVN用户名计算作者电子邮件的方式。

答案 1 :(得分:3)

你是对的,git再次从svn重播提交。 git中的分支只是提交(或者有id /哈希)的指针。来自svn的提交将具有不同的哈希值,并且只有当前签出的分支由git svn dcommit更新,因此您的主题分支仍指向旧提交