Git-Svn dcommit导致分支分裂

8
我有一个关于git-svn dcommits的问题,它导致git存储库无法跟踪哪些提交是哪些。我尽力确保git中的主分支始终跟随SVN存储库中的主干。因此,每当我在工作时,我都会在一个专题分支上工作。以下是我的情况:在一个专题分支上工作了一段时间。
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,然后将它们重新应用到主分支上。问题可能是它们具有不同的提交者信息。我使用Tortoise Plink和SSH密钥登录svn。

在Git仓库中尚未推送到SVN的提交具有以下提交者信息:

Collin Hockey <chockey@xyz.com>

提交到svn仓库的提交记录有以下内容:
chockey <chockey@6206317d-b652-48a9-a948-4036602fc523>

有没有什么方法可以防止这些分支断裂?我可以通过以下方式修复:

git rebase master my-topic

我觉得再重复一遍可能是没有必要的。这个问题的主要原因是一旦一个分支的更改被推送到SVN,git就不再认为该分支已经被合并到任何地方。这会使删除你不再需要的旧分支变得混乱。

2个回答

10

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

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

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

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

这就是为什么您的分支my-topicmaster分支分叉的原因。

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


1
那似乎效果好了一些,但提交仍然不同(它们也有不同的时间)。实际上有没有办法防止它们成为新的提交(或者只是自动更新两个分支上的提交),还是这只是使用git-svn桥接的问题? - Collin
2
@Collin 这就是 git-svn 的工作方式:SVN 提供提交记录,Git 忠实地反映它们。没有办法改变这种行为(当然,除非你编写自己的 Git-SVN 同步工具)。 - Laurent Pireyn
1
谢谢提供的信息。我会在dcommit后坚持使用rebase我的分支。不过,作者文件确实让我的历史记录更加漂亮 :) - Collin

3

你是正确的,Git会从SVN重新播放提交记录。在Git中,分支只是指向提交记录(或其ID /哈希)的指针。来自SVN的提交记录将具有不同的哈希,并且仅当前检出的分支会被git svn dcommit更新,因此您的主题分支仍然指向旧的提交记录。


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