TLDR:我似乎在主项目的子文件夹中创建了一个单独的存储库。我该如何组合它们?
我有一个项目文件夹,我们称之为 BOB 。我将(hg clone
) BOB 克隆到名为 BOB2 的新文件夹中。为了添加新功能,我在 BOB2 上创建了一个名为 BOB-newfeatures 的子文件夹。我一直在研究这个 BOB-newfeatures 文件夹,有很多签到。
今天我意识到我为 BOB-newfeatures 创建了一个单独的存储库(直到今天我还没有对 BOB2 main进行任何更改,所以我没有&#39 ;注意到没有跟踪变化)。如果我在 BOB2 上hg status
,则它不知道子文件夹中的更改,反之亦然。
有没有办法将这些拼接在一起?我知道我可以hg add
BOB-newfeatures 中的所有文件到 BOB 但是我想我丢失了所有的签到历史记录。
答案 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-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)
最后一步,你必须将两个历史重新链接到一个共同的历史。在我的情况下,由于我的行为(将转换为已转换的存储库,并且已存在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
预期的良好结果
答案 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所需的库但你不想直接绑在你的主人身上;然后他们会在预期的相对路径中找到并且很容易操作)