有没有办法在 mercurial 中将历史记录添加到文件中?

Is there a way to add history to a file in mercurial?

我们进行了一些通用代码重组,导致部分项目移至不同的新存储库。现在有几个文件(实际上最重要的是一个特定的文件)我想保留历史记录。

问题:是否可以导出单个文件的历史记录并将其导入到该文件已经可用的另一个存储库中?

也许只需要主分支会有所帮助。

插图:现状

Old Repo                                         Repo "New

          /--> V2---\    << not required
         /           \
V0 --> V1 ---> V3 --> V4  << required            V5 --> V6 ...

插图:理想情况

New Repo

V0 --> V1 --> V3 --> V4 --> V5 --> V6 ...

简短的回答是否定的。

较长的答案仍然是否定的,但有原因。 :-) Mercurial 仅在物理上和逻辑上 添加 到存储库,因此您的箭头向后绘制(或者更确切地说,不向后绘制,但它们 应该 向后)。由于您已经将 V6 引回到 V5,从而引回到 "nothing comes earlier",因此您添加的任何内容都将是 V7 或更高版本引回到 V6。

可以做的是构建另一个新的存储库,您可以在其中复制并提交 V0,然后复制并提交 V1,依此类推,直到达到 V6。这为您提供了一系列具有所需历史记录的新提交。让每个人都切换到 new 新存储库,您就完成了。这是否痛苦(以及有多痛苦)主要取决于您最近切换一次的时间。

是的,您可能可以使用 hg convert 和至少其 --filemap 参数来实现 objective。

当您设置新的存储库时,您可以修改其历史记录,至少在将其推送给其他任何人之前。此外,您可以使用原始版本的修改后的衍生版本作为基础合并到您的新版本中。

方法应该是 convert 您的旧存储库进入一个新存储库,其中只保留一个特定文件的历史记录。然后您可以从转换后的存储库中拉取到新的存储库中(参见:pull from unrelated)。

(根据您的分支方案,您可能还想使用带有 --branchmap 的转换过程,将重要文件的历史记录放在它自己的分支中。这有助于以后识别那些历史变化。如果所以,一旦你合并了 repos,你就可以将该分支合并到新分支中。)

当使用 convert 时,我建议将不同的步骤(文件映射、分支映射等)作为不同的个体来完成 "passes"。每个人都会创建一个新的临时存储库。这只会让每一步变得简单易懂。