Git Svn dcommit导致分支分裂

Git Svn dcommit导致分支分裂,svn,git,git-svn,Svn,Git,Git Svn,git svn dcommits使git存储库无法跟踪哪些提交是哪些 我试图确保git中的主分支始终遵循SVN存储库中的主干。所以每当我工作的时候,我都在一个主题分支上。以下是我的设想: 在主题分支工作一段时间 git checkout -b my-topic git commit -m "blah blah blah" 然后我决定将我的分支合并回master git checkout master git svn rebase #get any changes in svn git reba

git svn dcommits使git存储库无法跟踪哪些提交是哪些

我试图确保git中的主分支始终遵循SVN存储库中的主干。所以每当我工作的时候,我都在一个主题分支上。以下是我的设想:

在主题分支工作一段时间

git checkout -b my-topic
git commit -m "blah blah blah"
然后我决定将我的分支合并回master

git checkout master
git svn rebase #get any changes in svn
git rebase master my-topic
git merge my-topic --ff-only
到目前为止,一切都很顺利。我现在掌握了master和我的主题的最新进展,并指向同一个提交,整个历史如下所示:

A -- B -- C - master + my-topic
然而,当我

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

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

git存储库中尚未推送到SVN的提交具有以下提交者信息:

Collin Hockey <chockey@xyz.com>

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

没错,git会再次从svn重放提交。git中的分支只是指向提交(或有ID/哈希)的指针。来自svn的提交将有不同的散列,并且只有当前签出的分支由
git svn dcommit
更新,因此您的主题分支仍然指向旧的提交git svn dcommit命令工作如下:

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

    • 其说明包含对SVN修订版的参考
    • 他们的作者电子邮件是根据SVN用户名计算的
    这就是为什么您的分支
    我的主题
    主主题
    不同的原因


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

    这似乎工作得更好一些,但提交仍然不同(它们也有不同的时间)。实际上有没有办法防止它们成为新的提交(或者只是自动更新两个分支上的提交),或者这些只是使用git svn桥的中断?@Collin这就是git svn的工作方式:svn提供提交,git忠实地反映它们。没有办法改变这种行为(当然,除了编写自己的Git SVN同步工具),谢谢你提供的信息。我会坚持在提交数据后重新调整分支。不过,作者的档案确实让我的历史变得更加美丽:)
    Collin Hockey <chockey@xyz.com>
    
    chockey <chockey@6206317d-b652-48a9-a948-4036602fc523>
    
    git rebase master my-topic