18

这是一个非常深奥的问题,所以从一开始就澄清一下:我不是在谈论从 svn 到 git、从 git 到 mercurial 或从 mercurial 到 git 的转换。我说的是利用允许 Mercurial 在某种程度上与 git 和 SVN 互操作的“跨系统”插件所产生的复杂情况。

一段时间以来,我使用 Mercurial 的 hg-subversion 插件来“跟踪”code.google.com 上的上游 SVN 存储库。多亏了这个插件,Mercurial 认为存储库是“相关的”,并且能够提取自我上次从存储库中提取以来发生的更改。这允许我维护我自己的私有 Mercurial 存储库,其中包括私有变更集、分支、标签等,但它会定期同步并与上游 SVN 存储库上发生的更改合并。

上游仓库已经干净地从 SVN 转移到了 git。当我说得很清楚时,我的意思是他们已经带走了整个提交树,或者至少是影响我关心的默认/主分支的部分。

我现在的情况是,我有一个最新的 Mercurial 存储库,它与现已失效的 SVN 存储库上的最后一次签入合并,我想开始从新的上游 git 存储库中提取更改,从在 svn 存储库被移动到 github 之后发生的更改。

我可以使用很棒的 hg-git 插件从这个存储库中提取更改,但是由于当前存储库没有与 git 上游存储库“相关”的概念,它会提取所有更改,包括镜像变更集的所有更改已经存在于我的存储库中。

所以我正在寻找的是关于如何让我的 Mercurial 存储库通过 hg-git 考虑自身与上游 git 存储库相关的建议,并将 git 存储库中的所有适当提交视为“已经拉出”维护变更集奇偶性的目的。

我看到内部 hg-git 似乎使用了一个文件 .hg/git-mapfile 我假设它映射上游 git 和本地 Mercurial 存储库之间的变更集。这大概是一个线索。

让我的本地 Mercurial 存储库进入这样一种状态的最简单方法是什么,它基本上表现得好像它是作为上游 git 存储库的克隆开始的,但维护了我自己的所有随着时间的推移添加的不相关的变更集?

(注意:我不希望使用新的克隆“重新开始”,然后应用我的私有更改,因为我想维护此存储库的历史完整性以用于我自己的构建/调试目的)。

4

3 回答 3

5

我以前用 git 做过类似的事情。在 git->git 案例中,我能够执行 git-merge --strategy=ours 这基本上使我当前的存储库相信正在合并的所有内容都是无操作的。

你需要做的是一个分支,它代表你所知道的上游所有内容已经合并到你的树中,然后做一个无操作风格的合并到你的树中,然后开始使用“真正的”合并来拉入更改。

从这个网站:

https://www.mercurial-scm.org/wiki/TipsAndTricks#Keep_.22My.22_or_.22Their.22_files_when_doing_a_merge

我看到像下面这样的命令可能可以帮助您合并到上游存储库并忽略上游的所有内容:

$ hg --config ui.merge=internal:local merge #keep my files

这应该允许您将下游与上游重新同步。

于 2011-09-21T14:15:56.947 回答
2

我会使用 Hg-git 克隆新的上游存储库,然后尝试使用 Convert 扩展将旧本地存储库中的所有更改拼接到新存储库中。事实上,我可能会将本地 Hg-git 存储库克隆到本地 Mercurial 存储库,并使用来自上游 Git 存储库的两步拉取。

于 2011-09-21T17:58:47.573 回答
1

如果不存在现有的解决方案,我想可以编写一个脚本来修补并将您的更改提交到基于 git-clone 的新存储库。您“只”需要关联 hg-git-fromsvn 和 hg-svn 之间的 svn 版本,并复制您在新 repo 上完成的更新/补丁/提交/合并序列。

一个有趣的项目,不管是谁做的。:)

于 2011-09-21T14:11:35.553 回答