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-newfeatures
在 BOB2
中隐形的额外确认
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
预期效果不错
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-newfeatures
在 BOB2
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
预期效果不错