这是一个相当深奥的问题,所以从一开始就澄清一下:我不是在谈论从svn转换到git,从git转换到mercurial,或者从mercurial转换到git。我说的是一种复杂的情况,这种情况是由于利用"跨系统"插件而产生的,这些插件允许Mercurial在某种程度上与git和SVN进行互操作。
一段时间以来,我一直使用hg-subversion插件来"跟踪"cocode.google.com上的上游SVN存储库。多亏了这个插件,Mercurial认为存储库是"相关的",并且能够只拉入自我上次从仓库中拉出以来发生的更改。这允许我维护自己的私有Mercurial存储库,其中包括私有更改集、分支、标签等,但它会定期同步并合并上游SVN repo上发生的更改。
上游回购已经干净地从SVN转移到git。当我说干净的时候,我的意思是他们带走了整个提交树,或者至少是我关心的影响默认/主分支的部分。
我现在的情况是,我有一个Mercurial存储库,它与现在已经失效的SVN存储库上的最后一次签入合并,我想开始从新的上游git存储库中拉入更改,从SVN存储库移动到github后发生的更改开始。
我可以使用hg-git插件从这个存储库中拉出更改,但是由于当前存储库没有与git上游存储库"相关"的概念,它将拉出所有更改,包括所有镜像更改集已经存在于我的存储库中的更改。
所以我正在寻找的是关于如何让我的Mercurial存储库考虑自己的建议,通过hg-git,与上游git存储库相关,并且还考虑从git存储库中"已经拉出"的所有适当提交,以维护变更集奇偶性。
我看到hg-git内部似乎使用了一个文件。hg/git-mapfile,我认为它映射了上游git和本地Mercurial存储库之间的变更集。这可能是个线索。
让我的本地Mercurial存储库进入这样一种状态,它的行为基本上就像它开始时是上游git存储库的克隆,但维护我自己所有不相关的随时间添加的更改集,最简单的方法是什么?
(注意:我不喜欢用一个新的克隆"从头开始",然后应用我的私有更改,因为我想为我自己的构建/调试目的保持这个存储库的历史完整性)
我以前用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
我会用Hg-git克隆新的上游存储库,然后尝试使用Convert扩展将旧本地存储库中的所有更改剪切到新存储库中。实际上,我可能会将本地的Hg-git存储库克隆到本地的Mercurial存储库中,并从上游的Git存储库中使用两步拉取。
如果不存在现有的解决方案,我认为可以编写一个脚本来修补并将更改提交到基于git-clone的新存储库。你"只"需要在hg-git-fromsvn和hg-svn之间关联svn版本,并复制你在新repo上所做的更新/补丁/提交/合并顺序。
一个有趣的项目,无论谁做。:)