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

时间:2016-02-10 01:04:03

标签: mercurial

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

我有一个项目文件夹,我们称之为 BOB 。我将(hg clone BOB 克隆到名为 BOB2 的新文件夹中。为了添加新功能,我在 BOB2 上创建了一个名为 BOB-newfeatures 的子文件夹。我一直在研究这个 BOB-newfeatures 文件夹,有很多签到。

今天我意识到我为 BOB-newfeatures 创建了一个单独的存储库(直到今天我还没有对 BOB2 main进行任何更改,所以我没有&#39 ;注意到没有跟踪变化)。如果我在 BOB2 hg status,则它不知道子文件夹中的更改,反之亦然。

有没有办法将这些拼接在一起?我知道我可以hg add BOB-newfeatures 中的所有文件到 BOB 但是我想我丢失了所有的签到历史记录。

2 个答案:

答案 0 :(得分:2)

好的,我从

开始用你的名字重建(我希望)你的案子
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-newfeatures

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

解决问题的方法 - 使用倒置的Convert extension with --filemap,与Wiki相比,方向:它的例子将repo的子目录转换为单独的存储库,我将存储库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

将文件路径与来自嵌套repo的日志进行比较,注意变更集的不同哈希值

  • 接下来的坏消息:你不能从BOB | BOB2拉到已转换的存储库缺失部分 easy
BOB-newfeatures-conv>hg pull ../BOB2
pulling from ../BOB2
searching for changes
abort: repository is unrelated

即使使用--force(因为存储库真的不相关并且没有共享历史记录),您也会得到“脏”#34;组合存储库(根和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)

Force pull result

最后一步,你必须将两个历史重新链接到一个共同的历史。在我的情况下,由于我的行为(将转换为已转换的存储库,并且已存在BOB-newfeatures的历史记录),我必须在3-4-5之后链接0-1-2版本(历史上更早)变化)并且我不知道更优雅的方式,而不是再次转换(HG-> HG)存储库,这次使用--splicemap

使用日志输出

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

splicemap for rule" 0 after"可以创建(使用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

预期的良好结果

Final Repo

答案 1 :(得分:1)

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

find . -name "*.c" -print -or -name "*.cpp" -print -or -name "*.h" -print | xargs etags --append

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

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