git-svn在多个遥控器之间合并

时间:2011-06-30 14:51:26

标签: git git-svn

我有git-svn设置来跟踪两个远程svn位置,比如http://svnserver/develop/projecthttp://svnserver/release/project

我还创建了遥控器的本地分支,以便进行更改并向他们提交。但是,当我尝试将从本地开发分支的更改合并到本地发布分支时,我会遇到需要在文本编辑器中解决的冲突。

示例工作流程

# Setup the repos
git svn init http://svnserver/develop/project -R develop -i svn-develop
git svn init http://svnserver/release/project -R release -i svn-release
git svn fetch develop
git svn fetch release
git checkout svn-release
git checkout -b release
git checkout svn-develop
git checkout -b develop

# Make changes to develop branch and commit to svn
git commit -a -m "Changes"
git svn dcommit

# I'd like to bring changes to release branch
git checkout release
git merge develop --squash

# Ack! Conflicts :<

为什么git不能简单地将diff应用于发布分支?我是否错误地设置了遥控器?是因为他们不是从单亲家长中追踪的吗?

感谢帮助!

2 个答案:

答案 0 :(得分:1)

简短的回答是,不,你不能这样做。

一些细节:

您的初始合并问题是因为s​​vn-release和svn-develop不共享父提交,而git的自动合并工具根本不起作用。您必须手动合并并创建一个它们共享为父级的提交。

问题不止于此。 Subversion是如何管理提交的,你会注意到当你执行git svn dcommit时,你推送的本地提交实际上是在进入subversion之后重写的,以反映svn修订号。这会改变提交的本地git sha1sum,这实际上是对历史的重写。如果你有其他你合并的本地git分支,重写历史会导致各种问题,并且会继续遇到问题。

基本上,如果你进行初始合并提交,进行更多开发,然后重新推送这些更改,你的合并提交将被重写,更改为sha1sum,你的分支将不再共享父级。每次要合并/推送时,你都会再次遇到同样的问题。

答案 1 :(得分:0)

更长的答案:是的,你可以做到这一点,但不是琐碎的。

我所处的情况是我有两个独立的SVN存储库,以前是用Bazaar管理的。它们共享一个共同的历史(由Bazaar从一个repo推送到另一个repo),但是它们具有完全不同的提交ID,因为它们位于不同的存储库中,并且git-svn将repo ID卷入提交消息,这会影响SHA1。

他们 的共同之处在于他们的根树ID在它们发散的点之前是相同的 - 树对象的SHA1对于相同的树将是相同的。

所以我的计划是:

  • 退出一个或两个SVN存储库(我真的不想再这样做了)
  • 将所有修订迁移到同一个Git存储库

    1. 将两棵树克隆到不同的Git存储库
    2. 列出所有根树ID并比较它们以找到它们发散的点。
    3. 此时在我的目标存储库中创建一个分支
    4. 对于源存储库中的每个后续修订
      • 在源存储库中查看
      • 用此树替换目标存储库中的树
      • 提交该修订

我最终应该得到一个Git存储库,其中包含具有正确原点的两个分支分支。在这一点上,合并有望更容易。