Mercurial:合并到意外创建的子文件夹中

Mercurial: Merge in accidentally created subfolder

TLDR:我似乎在我的主项目的子文件夹中创建了一个单独的存储库。如何组合它们?

我有一个项目文件夹,我们称它为BOB。我将 (hg clone) BOB 克隆到一个名为 BOB2 的新文件夹中。为了添加新功能,我在 BOB2 上创建了一个名为 BOB-newfeatures 的子文件夹。我已经在这个 BOB-newfeatures 文件夹上工作了一段时间,有很多签入。

今天我意识到我以某种方式为 BOB-newfeatures 创建了一个单独的存储库(我没有在 BOB2 main 上进行任何更改,直到今天所以我没有注意到没有跟踪更改)。如果我在 BOB2 上执行 hg status,它不知道子文件夹中的更改,反之亦然。

有没有办法将它们拼接在一起?我知道我可以 hg add BOB-newfeatures 中的所有文件到 BOB 但后来我想我丢失了所有的签入历史.

您只是创建了一个单独的存储库。因此,您可以像从任何其他存储库中一样从该存储库中提取。在这种情况下,在 BOB2 中的主存储库中,您可以执行以下操作:

hg pull ./BOB-newfeatures

为了避免混淆,我首先将 BOB-newfeatures 移动到与 BOB2 相同的目录级别,然后拉动然后给出新的相对路径../BOB-newfeatures;但这更多的是为了装饰品和保持 BOB2 存储库的清洁;严格来说应该不需要。

(基本上你使用了 hg 的一个特性:你可以在任何子路径中创建一个新的 repo,这将是一个独立的 repo,它不知道父级,反之亦然。它用于例如需要的库main repo 但你不想直接绑定到你的 main;然后它们会在预期的相对路径中找到并且很容易操作)

好的,我用你的名字重建了(我希望)你的案例,从

开始
BOB2>hg log -T "{node|short}\tFiles: {join(files, ', ')}\n"
25a16a8fea5e    Files: Sub/3.txt
bf3c6cacb4a4    Files: 1.txt, 2.txt
ff71a2b1bbe3    Files: 1.txt

和嵌套回购

BOB2\BOB-newfeatures>hg log -T "{node|short}\tFiles: {join(files, ', ')}\n"
acac7d413ed2    Files: f1.txt
15a1f9cacf25    Files: f2.txt
f3055921fa01    Files: f1.txt

作为对 BOB-newfeaturesBOB2

中隐形的额外确认
BOB2>hg manifest
1.txt
2.txt
Sub/3.txt

解决问题的方法-使用Convert extension with --filemap in inverse, compared to Wiki, direction: 示例将repo的子目录转换为单独的存储库,我将把repository-root移动到子文件夹

  • 地图文件,准备转换
rename . BOB-newfeatures
  • 转化
hg convert --filemap map z:\BOB2\BOB-newfeatures z:\BOB-newfeatures-conv
initializing destination z:\BOB-newfeatures-conv repository
scanning source...
sorting...
converting...
2 New feature started
1 Change 1
0 Change 2
  • 检测结果
BOB-newfeatures-conv>hg log -T "{node|short}\tFiles: {join(files, ', ')}\n"
a3b2c462a3b9    Files: BOB-newfeatures/f1.txt
f5f1168cfe2f    Files: BOB-newfeatures/f2.txt
da27a50a5cb6    Files: BOB-newfeatures/f1.txt

将文件路径与嵌套存储库中的日志进行比较,注意变更集的不同哈希值

  • 下一个坏消息:您不能直接从 BOB|BOB2 拉入转换后的存储库缺少的部分 简单
BOB-newfeatures-conv>hg pull ../BOB2
pulling from ../BOB2
searching for changes
abort: repository is unrelated

即使使用 --force(因为存储库 真的不相关 并且不共享历史记录)你会得到 "dirty" 组合存储库(根目录和BOB-newfeatures/ 是两个独立的更改行,具有自己的根和提示)

BOB-newfeatures-conv>hg pull ../BOB2 -f
pulling from ../BOB2
searching for changes
warning: repository is unrelated
requesting all changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 4 changes to 3 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

最后一步,您必须重新link 将两个历史记录合并为一个公共记录。在我的情况下,由于我的行为(将 拉到 已转换的存储库,其先前的历史记录为 BOB-newfeatures),我不得不在 3 之后进行 link 0-1-2 次修订-4-5(历史上更早的更改),我不知道比再次转换(HG-> HG)存储库更优雅的方法,这次使用 --splicemap

有日志输出

>hg log -T "{rev} {node}\n"
5 25a16a8fea5e5b4dac42a0a6b2c8e82890c220a3
4 bf3c6cacb4a4c22cb5720ddeab1ec5f8238a98c9
3 ff71a2b1bbe30a56c9dabc9a7ddb2bbccad840af
2 a3b2c462a3b917b3ba58daee3df2632875baee17
1 f5f1168cfe2f4b6c67d0af8a9259665ae2d40bd5
0 da27a50a5cb6246c03c6af7485ac7ffc33e62738

可以创建规则“0 after 5”的拼接图(格式为 oneliner "ChildHash ParentHash")

da27a50a5cb6246c03c6af7485ac7ffc33e62738 25a16a8fea5e5b4dac42a0a6b2c8e82890c220a3

和最后一次执行的转换

>hg convert  --splicemap z:\map z:\BOB-newfeatures-conv z:\BOB3
scanning source...
sorting...
converting...
5 Initial data
4 Changes
3 More changes
2 New feature started
spliced in 25a16a8fea5e5b4dac42a0a6b2c8e82890c220a3 as parents of da27a50a5cb6246c03c6af7485ac7ffc33e62738
1 Change 1
0 Change 2

预期效果不错