解决Git Svn冲突

时间:2009-04-17 12:59:10

标签: git git-svn

我正在使用Git-Svn在工作中与Svn存储库进行交互,而我似乎找不到有效解决冲突的方法。我已经阅读了关于这个主题的其他问题,但显然我需要更多补救措施,因为我似乎总是以某种无限循环结束。我重新定义,使用mergetool(meld)来解决我的冲突,当我结束所有这些时,我尝试做一个dcommit,并在提交错误期间遇到合并冲突。

我知道这感觉就像是重复一样,但是沮丧让我再次提出问题,并提供了一些非常具体的细节,说明我将如何处理这个问题,希望有人可以告诉我我的进程到底搞砸了。

我的设置:

我有一个远程分支(svn / trunk),一个本地分支(trunk)和另一个我通常工作的本地分支(working-trunk)。从svn / trunk检出干线,从干线检查工作干线。

以下是我一直在做的事情:

  1. 在我的主干上,git svn rebase(返回冲突)
  2. git mergetool
  3. [解决该文件的冲突]
  4. 保存合并后的文件,然后关闭meld。
  5. git add .
  6. git rebase --continue
  7. [冲洗,重复]
  8. 如果我收到一条消息,询问我是否使用了git addgit rebase --skip
  9. 当我到达所有报告的更改结束时,一切都停止了,我想也许我不知道该做什么。 Git没有显示任何内容,我似乎又回到了主干上。 Git然后允许我dcommit,但如果我之后立即尝试rebase,我最终会重新解决我刚刚解决的冲突。

    这显然是我在这里缺少的一个关键部分,但我只是看不到它而且它引起了很多问题和挫折。在Git中合并可能很容易,但我肯定不会发现这种情况。

    感谢。

    更新:只是想快速更新以描述我的工作流程,以防出现问题的部分(或全部)。

    首先,在使用svn/前缀克隆我的存储库后,我有了svn/trunk远程分支。鉴于:

    1. git co -b trunk svn/trunk将我的遥控器检出本地分支。
    2. git co -b working-trunk创建一个工作分支,用于创建一个更大程度的分离,以便我的本地主干始终可以镜像我的远程主干。
    3. 我删除了默认的主分支(当使用svn时,我发现用“trunk”而不是“master”更容易思考。)
    4. 一旦我拥有了所有分支机构,我的典型工作流程就像这样:

      1. working-trunk 上,我进行了更改并提交了它们。
      2. git co trunk并执行git svn rebase
      3. 假设新代码已重新定位,我git rebase working-trunk
      4. git co working-trunk
      5. git merge trunk
      6. git rebase trunk
      7. git co trunk
      8. git merge working-trunk
      9. git svn dcommit
      10. 我知道,这是很多步骤,但这就是所有人和其他人都推荐的。我的致命缺陷可能会在这个过程中出现吗?

        再次感谢。

7 个答案:

答案 0 :(得分:5)

我建议使用git rebase而不是git merge。 Svn保持线性历史,有时似乎与git branch merge相混淆。使用git rebase可确保svn理解线性历史。

请参阅: http://learn.github.com/p/git-svn.html了解更多信息和指南。

答案 1 :(得分:4)

我最终遇到了同样的问题(git svn rebase返回冲突)。 我在工作流程中发现了问题。以下是我/您应遵循的工作流程:

git svn rebase # put all the new commits on top

git svn dcommit # push the new commits to svn (will rewrite each commit message to add the svn tag)

git pull # merge the conflicts due to the commit messages

git push # push the synchronized version to the remote git server

每当我忘记在dcommit之后合并历史记录时,如果我做新的提交,我会出现新的(假的)冲突。要解决这些问题,您可以按照上述方法进行操作,或者由于与我完全相同的问题,您也可以使用以下方法自动完成:

git svn rebase --strategy ours

答案 2 :(得分:1)

人们可能会发现SubGit的方法更容易:

  1. 将SubGit安装到服务器端的Subversion存储库
  2. 使用git而不是git-svn将更改发送到SVN存储库*
  3. SubGit安装会创建SVN存储库的Git对应物。将此存储库克隆到您的本地存储库;创建任何分支并将它们推送到远程Git存储库,SubGit自动将这些分支转换为SVN。

    有关详细信息,请参阅SubGit documentationgit-svn comparison

    *适用于任何Git客户端。

答案 3 :(得分:0)

我尝试了这个(我承认很小的)冲突,我强迫,git svn dcommit我没有进一步的冲突。一个区别是我没有收到有关git add的消息。您的团队是否可能只是发送了许多与您的工作发生冲突的提交?这似乎不太可能,但似乎是最简单的解释。

您可能值得花时间在另一个位置再次获取repo,并测试是否可以推送非冲突更改,以确保在dcommit阶段中以某种方式隐藏时没有通信问题。

更新:我有另一个想法:当我完成解决冲突时,我做了git add foo.bar。可能git add .正在做出意想不到的事情吗?我并没有真正扩展git svn的功能,所以这些都是WAG。

答案 4 :(得分:0)

似乎某些事情并没有像您认为的那样运作。如果这不是Hank Gay建议的不太可能的事情,那么这是另一个不太可能的事情。

我不太可能的是,您的分支结构不是您认为的那样,或者您没有在您认为自己的分支上进行变基础。所以我建议你:

  1. git branch只是为了确认您的分支结构是您所期望的

  2. 添加
    export PS1='\e[0;31m\n\w$(__git_ps1 "(%s)") $ \e[m'
    到〜/ .bash_profile并再次登录,
    在提示符中显示分支(以及任何进程中的git命令):

    / workspace / wikka(featurebranch1 | REBASE-i)$

  3. 这将为您提供更多反馈(并且可能会消除此WAG)。

答案 5 :(得分:0)

我建议仅在本地 trunk 和远程 trunk 之间使用git-svn。在本地 trunk 和本地 mytrunk 之间,坚持使用标准的git功能。您可以尝试这样的工作流程:

[SVN]---git-svn---[trunk]---branch---[mytrunk]

要合并,请切换到 trunk 并执行:

git svn rebase

这会从遥控器中提取更改并将其与 trunk 合并。然后,切换到 mytrunk 并执行:

git rebase

这会从 trunk 中提取更改并将其与 mytrunk 合并。我认为它应该有效。否则,只需git-clone本地主干并改为克隆。

答案 6 :(得分:0)

我在使用推荐的工作流程时遇到了这个问题,所以我认为我们在这里没有答案。

以下是我遇到这种情况的方法。

我使用Apache基础架构通过git svn获得git repo。

我有一个本地分支。

我尝试按照这个程序:

1)rebase trunk。 2)将trunk合并到私有分支。 3)做好工作。 4)rebase trunk。 5)将private合并到trunk中。 6)dcommit。

然而,我搞砸了,我忘记了从私人到后备箱的改变。然后,我对我的私人分支进行了一系列其他更改,最后在完全虚假的冲突中进行了冲洗和重复循环。我推动的最后一个改变是评论出一行。当我在被忽视的变化中删除那条线时,它产生了无法解决的冲突,无论如何。我最终使用了--skip。