Git-Svn dcommit导致分支分裂

Col*_*lin 8 svn git git-svn

我遇到了git-svn dcommits的问题,使得git存储库无法跟踪哪些提交.

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

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

git checkout -b my-topic
git commit -m "blah blah blah"
Run Code Online (Sandbox Code Playgroud)

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

git checkout master
git svn rebase #get any changes in svn
git rebase master my-topic
git merge my-topic --ff-only
Run Code Online (Sandbox Code Playgroud)

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

A -- B -- C - master + my-topic
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做的时候

git svn dcommit
Run Code Online (Sandbox Code Playgroud)

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

  -- B -- C - my-topic
 /
A -- B -- C - master + remotes/trunk
Run Code Online (Sandbox Code Playgroud)

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

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

Collin Hockey <chockey@xyz.com>
Run Code Online (Sandbox Code Playgroud)

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

chockey <chockey@6206317d-b652-48a9-a948-4036602fc523>
Run Code Online (Sandbox Code Playgroud)

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

git rebase master my-topic
Run Code Online (Sandbox Code Playgroud)

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

Lau*_*eyn 10

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

  1. 查找来自SVN的最后一次提交; 我们称之为last-svn
  2. 将范围内的提交发送last-svn..HEAD到Subversion(顺便丢弃电子邮件)
  3. 重置HEADlast-svn
  4. 从SVN更新并创建相应的提交

换句话说,您发送到SVN的提交将被销毁并从SVN的更新中重新创建.这必须发生,因为来自SVN的提交与使用Git创建的提交不同:

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

这就是你的分支my-topic偏离的原因master.

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

  • @Collin这是git-svn的工作方式:SVN提供了提交,Git忠实地反映了它们.没有办法改变这种行为(当然,除了编写自己的Git-SVN同步工具). (2认同)