2009-04-17 193 views
9

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

我知道这感觉像是重复的,但令人沮丧的是让我再次问到,关于我如何去做这件事的一些非常具体的细节,以便希望有人能够确切地告诉我我的过程被搞砸了。

我的设置:

我有一个远程分支(SVN /主干),一个本地分支(主干)和另一个本地分支,我通常在(工作干线)工作。树干从svn/trunk检出,工作树干从trunk中检出。

这就是我一直在做:

  1. 在我的树干,git svn rebase(返回冲突)
  2. git mergetool
  3. [解析该文件冲突]
  4. 保存合并后的文件从融合并紧密融合。
  5. git add .
  6. git rebase --continue
  7. [漂洗,重复]
  8. 如果我问一个消息我是否使用git add,我git rebase --skip

当我到的所有报告的变化结束,一切都只是停止,我想也许我不知道该怎么做。 Git没有显示任何内容,我似乎回到了主干上。然后Git允许我提交,但如果我之后立即尝试重新绑定,我最终会重新解决我刚刚解决的冲突。

显然我在这里错过了一个关键的部分,但我只是没有看到它,它导致了很多问题和挫折。在Git中合并可能很容易,但我肯定不会发现这种情况。

谢谢。

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

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

  1. git co -b trunk svn/trunk检查我的远程到本地分支。
  2. git co -b working-trunk创建一个工作分支,我用它来创建一个更多的分离度,以便我的本地中继可以始终镜像我的远程中继。
  3. 我删除了默认主分支(当使用svn时,我觉得用“trunk”而不是“master”来思考更容易)。

一旦我有我所有的分支,我的典型的工作流程是这样的:

  1. 工作干线,我做我的变化,并提交它们。
  2. I 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

这是一个很大的步骤,我知道,但这是建议每个人都在这里和其他地方。在这个过程中,我的致命缺陷会在哪里?

再次感谢。

+1

做了回答您采摘(Jistin's)解决问题? – inger 2010-06-17 14:19:00

回答

5

我会推荐使用git rebase而不是git merge。 Svn保持线性历史,并且似乎与git分支合并有时混淆。使用git rebase可确保svn能够理解线性历史记录。

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

1

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

您可能需要花时间在不同位置再次获取repo,并测试是否可以推送非冲突性更改以确保在以某种方式隐藏的dcommit阶段没有通信问题。

更新:我有一个想法:当我完成解决冲突时,我做了一个git add foo.bargit add .是否在意料之中?我没有真正扩展git svn的功能,所以这些都是WAGs。

+0

这也可能是因为我对我的存储库的处理方式太sl but,但我不确定该如何/为什么会这样。我遇到过几次,每次都彻底杀死和重建我的回购协议。非常令人沮丧。 感谢您的想法。 – 2009-04-17 13:31:29

1

看来有些东西并不按照您认为的方式运行。如果这不是汉克盖伊提出的不太可能的事情,那么这是另一件不太可能的事情。

我的可能性不大可能是你的分支结构不符合你的想法,或者你没有在你认为自己的分支上重组。因此,我建议你:

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

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

    /工作区/ wikka(featurebranch1 | REBASE-I)$

这将使你更多的反馈意见(可能会消除这个WAG)。

0

我会建议只使用git-svn在您的本地中继线和远程中继线之间。在您当地的中继与本地mytrunk之间,坚持只有标准的git唯一功能。你可能尝试的工作流程是这样的:

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

要合并,切换到干线并做了:

git svn rebase 

这拉从远程更改,并主干将其合并。然后,切换到mytrunk并做了:

git rebase 

这是直接从树干变化,并与mytrunk合并。我认为它应该工作。否则,只是git克隆本地中继线,而不是克隆工作。

+0

这听起来像我所做的,如果我正确理解你的话。我会用我的工作流程更新我的原始问题。 – 2009-04-19 18:49:11

0

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

下面是我进入这种情况。

我有一个通过git svn使用Apache基础设施的git repo。

我有一个本地分支。

我试着按照这个程序:

1)rebase trunk。 2)将树干合并到私人分支。 3)做功。 4)rebase trunk。 5)将私有合并到主干中。 6)dcommit。

但是,我搞砸了,我忘了推动从私人到主干的改变。然后,我对我的私人分支进行了一系列其他更改,最终在冲突和重复循环中进行了完全虚假的冲突。我推出的最后一项改变是将一行注释掉。当我在被忽视的变化中删除了这条线时,无论如何,它产生了无法解决的冲突。我最终使用了 - 跳过它。

1

人们可能会发现SubGit“的做法更容易一点:

  1. 在服务器端安装SubGit到Subversion版本库
  2. 使用gitgit-svn发送更改SVN仓库*

SubGit安装会创建SVN存储库的Git副本。将此存储库克隆到本地存储库;创建任何分支并将它们推送到远程Git存储库,SubGit自动将这些分支转换为SVN。

欲了解更多详情请参阅SubGit documentationgit-svn comparison

*适用于任何Git客户端。

3

我最终遇到了同样的问题(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 
+0

事实上,我遇到了一些与我们的战略有关的问题。它似乎忽略了新的提交。现在,我只需运行`git rebase --skip',直到停止抱怨为止。 – user1448926 2013-06-26 20:25:40