我正在使用Git-Svn在工作中与Svn存储库进行交互,而我似乎找不到有效解决冲突的方法。我已经阅读了关于这个主题的其他问题,但显然我需要更多补救措施,因为我似乎总是以某种无限循环结束。我重新定义,使用mergetool(meld)来解决我的冲突,当我结束所有这些时,我尝试做一个dcommit,并在提交错误期间遇到合并冲突。
我知道这感觉就像是重复一样,但是沮丧让我再次提出问题,并提供了一些非常具体的细节,说明我将如何处理这个问题,希望有人可以告诉我我的进程到底搞砸了。
我的设置:
我有一个远程分支(svn / trunk),一个本地分支(trunk)和另一个我通常工作的本地分支(working-trunk)。从svn / trunk检出干线,从干线检查工作干线。
以下是我一直在做的事情:
git svn rebase
(返回冲突)git mergetool
git add .
git rebase --continue
git add
,git rebase --skip
当我到达所有报告的更改结束时,一切都停止了,我想也许我不知道该做什么。 Git没有显示任何内容,我似乎又回到了主干上。 Git然后允许我dcommit,但如果我之后立即尝试rebase,我最终会重新解决我刚刚解决的冲突。
这显然是我在这里缺少的一个关键部分,但我只是看不到它而且它引起了很多问题和挫折。在Git中合并可能很容易,但我肯定不会发现这种情况。
感谢。
更新:只是想快速更新以描述我的工作流程,以防出现问题的部分(或全部)。
首先,在使用svn/
前缀克隆我的存储库后,我有了svn/trunk
远程分支。鉴于:
git co -b trunk svn/trunk
将我的遥控器检出本地分支。git co -b working-trunk
创建一个工作分支,用于创建一个更大程度的分离,以便我的本地主干始终可以镜像我的远程主干。一旦我拥有了所有分支机构,我的典型工作流程就像这样:
git co trunk
并执行git svn rebase
。git rebase working-trunk
。git co working-trunk
git merge trunk
git rebase trunk
git co trunk
git merge working-trunk
git svn dcommit
我知道,这是很多步骤,但这就是所有人和其他人都推荐的。我的致命缺陷可能会在这个过程中出现吗?
再次感谢。
答案 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的方法更容易:
git
而不是git-svn
将更改发送到SVN存储库* SubGit安装会创建SVN存储库的Git对应物。将此存储库克隆到您的本地存储库;创建任何分支并将它们推送到远程Git存储库,SubGit自动将这些分支转换为SVN。
有关详细信息,请参阅SubGit documentation和git-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建议的不太可能的事情,那么这是另一个不太可能的事情。
我不太可能的是,您的分支结构不是您认为的那样,或者您没有在您认为自己的分支上进行变基础。所以我建议你:
git branch
只是为了确认您的分支结构是您所期望的
添加
export PS1='\e[0;31m\n\w$(__git_ps1 "(%s)") $ \e[m'
到〜/ .bash_profile并再次登录,
在提示符中显示分支(以及任何进程中的git命令):
/ workspace / wikka(featurebranch1 | REBASE-i)$
这将为您提供更多反馈(并且可能会消除此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。