如何使用hg-git关联现有的Mercurial和git存储库?

时间:2011-09-21 14:03:46

标签: git mercurial hgsubversion hg-git

这是一个非常深奥的问题,所以只是从头开始说清楚:我不是在谈论从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上游存储库“相关”的概念,因此它将提取所有更改,包括其镜像的所有更改-image changesets已存在于我的存储库中。

所以我正在寻找的是如何让我的Mercurial存储库通过hg-git考虑自己,与上游git存储库相关的建议,并考虑git存储库中所有适当的提交“已经”拉“是为了保持变革平等。

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

将本地Mercurial存储库置于这样一种状态的最简单方法是什么?它本质上就像它是作为上游git存储库的克隆而开始的,但是维护了我自己随时间添加的所有不相关的变更集? / p>

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

3 个答案:

答案 0 :(得分:5)

我以前用git做过类似的事情。在git-> git的情况下,我能够做一个git-merge --strategy = ours,它基本上使我当前的存储库相信所有被合并的东西都是无操作。

你需要做的是一个代表上游的分支,你知道它已经合并到你的树中,然后在你的树中进行无操作的合并,然后开始用“真正的”合并进行更改。 / p>

从这个网站:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

一个有趣的项目,对任何人来说都是如此。 :)