将mercurial存储库转换为具有完整历史记录的子存储库(如hg log -f)

Jor*_*gas 6 mercurial

最近我将我的mercurial存储库中的一些文件移动到子目录(作为模块)以保持一切整洁.几天后,我发现我需要在另一个项目中使用该模块,所以我正在尝试将其转换为自己的mercurial存储库.

我面临的问题是新的存储库历史记录未完成,它只包含重命名后的文件历史记录.我得到的历史与执行相同hg log filename,我想要的是拥有文件的完整历史记录,比如输出hg log -f filename.

我错过了什么?

谢谢.

Ste*_*aye 8

我假设你有这样的结构:

main.c
lib1.c
lib2.c
Run Code Online (Sandbox Code Playgroud)

你重命名了文件并得到了这样的东西:

main.c
lib/lib1.c
lib/lib2.c
Run Code Online (Sandbox Code Playgroud)

您现在需要像lib存储库这样的东西:

lib1.c
lib2.c
Run Code Online (Sandbox Code Playgroud)

我假设这最后一部分是因为,当您将其作为子存储库包含时,它将看起来像您的原始存储库在重命名后所做的那样.

我会在几个阶段做到这一点.

第一阶段就是你可能已经做过的事情.使用命令行hg convert --filemap LibTempMap.txt Main LibTemp和以下内容转换存储库LibTempMap.txt:

exclude *
include lib
rename lib .
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个存储库,其中包含重命名后的历史记录.

第二阶段是在使用命令行重命名之前转换存储库hg convert --rev X --filemap LibMap.txt Main Lib(其中X是重命名之前的修订版)以及以下内容LibMap.txt:

exclude *
include lib1.c
include lib2.c
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个存储库,其中包含重命名之前的历史记录.

然后我就从移植后的变化LibTemp,以Lib使用hg transplant -s ..\LibTemp Y:tip来自内部Lib文件夹(其中Y为重命名后的版本LibTemp).这应该干净地移植,因为通过在转换期间进行重命名,确保临时存储库中的文件结构相同.

然后,您将获得Lib包含所需历史记录和文件的LibTemp存储库,并可以删除存储库.