16

我已经开始在 SVN 存储库中工作。我已经将它的一个子文件夹克隆到了本地 Hg 存储库中hg clone

后来,我想把这个分享给一个无法访问 SVN 存储库的同事。我创建了一个私有 BitBucket 存储库,我们偶尔会推送更改,因此我不得不拉取它们。

hgsubversion对变更集做了一些讨厌的事情,比如改变他们的提交者(我什至相信哈希)。当我尝试推送和拉取 BitBucket 存储库时,我不得不进行合并。

现在我无法将更改推送回 Subversion 存储库,因为我们心爱的朋友abort: Sorry, can't find svn parent of a merge revision..

如何将 BitBucket-targeting Mercurial 存储库与 svn-targeting Mercurial 存储库一起拉取,同时保持兼容hgsubversion(即,不导入合并修订)?

当然,一些自动化的方法将不胜感激,但如果没有这样的事情/简单的方法来做到这一点,我将不胜感激任何解决方案。

我用hgsubversion,不是hgsvn;也就是说,一个扩展hg clone svn://repo/url。不过,如有必要,我愿意切换。

4

3 回答 3

21

当您在 subversion 存储库上使用 Mercurial 时,您仍然必须像 SVN 那样思考,因此基本 Mercurial 工作流程的许多功能部分将无法正常工作。在 svn 仓库上合并 mercurial 的方式是不可能的。如果您已将您的工作与拉取的 svn 分支合并,您将收到臭名昭著的关于您现在收到的消息 :(

我建议您阅读 durin42 对这个问题的回答。

编辑:为了摆脱当前的混乱,我建议您从您从 SVN 存储库签出的那一点开始创建一个补丁(或一系列补丁)。从 subversion 存储库中获取新副本并应用补丁。我不确定您能否从当前的回购中做到这一点。您可以探索 hg diff 命令。

hg diff -g -r tip -r XXX > patch

XXX 是您的原始 SVN 结帐(我还没有测试过。)

于 2010-10-23T14:47:17.207 回答
10

是的,hgsubversion 确实更改了提交者名称,因为它必须反映 Subversion 分配的名称。然后, Hgsubversion还必须更改变更集哈希。这不是 hgsubversion 可以决定的事情——它内置于 Mercurial 的设计中,即变更集哈希基于变更集中的所有信息,并且包括提交者的名称。

请阅读我的hgsubversion 指南以获取有关如何正确使用 hgsubversion 的信息。要记住的重要一点是 hgsubversion 变成hg了一个更好的svn,但它仍然是 Subversion 是主人。这意味着您必须在将其推回 Subversion 之前线性化您的历史记录,这样就不会发生合并或其他有趣的 DVCS 事情。

如果您确实想利用 Mercurial 中的分布式功能,那么在小迭代中进行:在 Mercurial 中进行一些协作,线性化变更集并推回 Subversion,销毁克隆的非线性部分,从 Subversion 中提取。然后,您可以在 Mercurial 中重复协作的新迭代。

于 2010-10-25T06:28:21.990 回答
0

我刚刚遇到了一个类似的问题,基本上是:

  • 使用 HgSubversion 克隆 SVN 存储库
  • 通过一些合并来解决
  • 试图将其拉回以前的 SVN 存储库

并遇到了可怕的Sorry, can't find svn parent of a merge revision消息。

这就是我没有太多麻烦地修复它的方法:

  1. 从此链接下载 TortoiseSVN并安装它。
  2. 使用上下文 Windows 资源管理器菜单中的命令将 SVN 存储库签出到新文件夹SVN Checkout...(右键单击以访问它)。
  3. 将本地 HG 文件夹(.hg仅不包括子文件夹)的内容复制到新创建的 SVN 文件夹中,覆盖所有文件。
  4. 右键单击该文件夹并执行SVN Commit....
  5. 丢弃您的 HG 存储库并将其从现已更新的 SVN 存储库中拉回。

这需要 2 分钟,一切都应该重新开始工作。你会丢失一些合并和提交信息,但这应该不是问题,因为 SVN/HgSubversion 组合无论如何都无法跟踪它们。

于 2015-08-11T18:10:37.087 回答