10

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

我知道这感觉像是重复,但沮丧让我再次询问,并提供了一些关于我将如何处理的非常具体的细节,以便希望有人能准确地告诉我我的流程在哪里搞砸了。

我的设置:

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

这是我一直在做的事情:

  1. 在我的后备箱上,git svn rebase(返回冲突)
  2. git mergetool
  3. [解决该文件的冲突]
  4. 从 meld 中保存合并的文件并关闭 meld。
  5. git add .
  6. git rebase --continue
  7. [冲洗,重复]
  8. 如果我收到一条消息询问我是否使用过git add,我git rebase --skip

当我完成所有报告的更改时,一切都停止了,我想也许我现在不确定该怎么做。Git 没有显示任何要提交的内容,我似乎又回到了主干上。然后 Git 允许我 dcommit,但如果我之后立即尝试变基,我最终会重新解决我刚刚解决的冲突。

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

谢谢。

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

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

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

拥有所有分支后,我的典型工作流程如下所示:

  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

这是很多步骤,我知道,但这是这里和其他地方的每个人都推荐的。我的致命缺陷可能在那个过程中的某个地方吗?

再次感谢。

4

7 回答 7

5

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

有关更多信息和指南,请参见: http ://learn.github.com/p/git-svn.html。

于 2009-04-23T06:54:46.373 回答
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
于 2013-04-09T17:33:43.810 回答
1

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

  1. 将 SubGit 安装到服务器端的 Subversion 存储库中
  2. 用于gitgit-svn向 SVN 存储库发送更改*

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

有关详细信息,请参阅SubGit 文档git-svn 比较

* 适用于任何 Git 客户端。

于 2012-07-18T17:38:04.703 回答
0

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

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

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

于 2009-04-17T13:23:38.813 回答
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) $

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

于 2009-04-18T06:48:45.807 回答
0

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

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

要合并,请切换到中继并执行以下操作:

git svn rebase

这会从远程提取更改并将其与trunk合并。然后,切换到mytrunk并执行以下操作:

git rebase

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

于 2009-04-18T07:58:17.853 回答
0

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

这就是我遇到这种情况的方式。

我使用 Apache 基础架构通过 git svn 有一个 git repo。

我有一个当地的分支机构。

我尝试遵循以下程序:

1)重新设置主干。2)将主干合并到私有分支。3)做工作。4)重新设置主干。5)将私有合并到主干中。6) 提交。

但是,我搞砸了,我忘记将更改从私有推送到中继。然后,我对我的私有分支进行了一系列其他更改,并最终陷入了完全虚假冲突的冲洗和重复循环。我提出的最后一个更改是注释掉一行。然后,当我在被忽略的更改中删除该行时,它产生了无论如何都无法解决的冲突。我最终使用了 --skip 。

于 2009-08-23T14:50:58.680 回答