我遇到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就不再认为分支已被合并到任何地方。删除不再需要的旧分支会让人感到困惑。
答案 0 :(得分:10)
git svn dcommit
命令的工作原理如下:
last-svn
last-svn..HEAD
范围内的提交发送给Subversion(顺便丢弃电子邮件)HEAD
重置为last-svn
换句话说,您发送到SVN的提交将从SVN的更新中销毁并重新创建。这必须发生,因为来自SVN的提交与使用Git创建的提交不同:
这就是您的分支my-topic
与master
不同的原因。
您可以使用git svn dcommit
和--authors-file
选项自定义--authors-prog
从SVN用户名计算作者电子邮件的方式。
答案 1 :(得分:3)
你是对的,git再次从svn重播提交。 git中的分支只是提交(或者有id /哈希)的指针。来自svn的提交将具有不同的哈希值,并且只有当前签出的分支由git svn dcommit
更新,因此您的主题分支仍指向旧提交