如何将子文件夹转换为子存储库?

How to transform a subfolder into a subrepository?

我的存储库中有一个子文件夹,我想将其提取到子存储库中。问题是您必须提交从原始存储库中删除该文件夹中的所有文件,这会在尝试更新到较早版本时产生问题。此外,如果您首先启动了一个子仓库,将其添加到 .hgsub,然后才提交删除原始文件,它也会从子仓库中删除它们(有点混乱)。

是否有更好的方法告诉 Mercurial 文件已移至子存储库,未更改?

在这里保持理智的关键是 Mercurial 的 convert 功能。基本方法已在 http://mercurial.aragost.com/kick-start/en/subrepositories/ 中总结如下:

Converting Folder Into a Subrepository

A project might contain a folder with some code, which at a later point is realized should be used across different projects. This code could of course just be copied to a repository, which the projects could include as subrepository. This would however mean that we would loose our precious history of these files.

The way to do it, is by converting a folder into a repository, using the convert extension and then include this repository as a subrepository in the different projects.

更多详细信息在引用的页面以及 https://www.mercurial-scm.org/wiki/ConvertExtension

中提供

如果这是一个选项,那么您可以考虑使用 convert 两次,将原始存储库分成两部分 - 一个包括所选文件(及其历史记录),另一个不包括它们。

说明性文字记录(仅调用 convert 一次)

/tmp$ mkdir repo
/tmp$ cd repo
/tmp/repo$ hg init
/tmp/repo$ echo a > a.txt
/tmp/repo$ mkdir folder
/tmp/repo$ echo b > folder/b.txt
/tmp/repo$ hg addremove
hg addremove
adding a.txt
adding folder/b.txt
/tmp/repo$ hg commit -m init
/tmp/repo$ (echo include folder; echo rename folder .) > map.txt
/tmp/repo$ hg convert --filemap map.txt . subrepo
initializing destination subrepo repository
scanning source...
sorting...
converting...
0 init
/tmp/repo$ cd subrepo
/tmp/repo/subrepo$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
/tmp/repo/subrepo$ find .
.
./b.txt
./.hg
<etc>
/tmp/repo/subrepo$ cd ..
/tmp/repo$ hg rm folder/b.txt
/tmp/repo$ file folder
file folder
folder: cannot open `folder' (No such file or directory)
/tmp/repo$ ls
a.txt   map.txt subrepo
/tmp/repo$ mv subrepo folder
/tmp/repo$ echo folder = folder > .hgsub
/tmp/repo$ hg add .hgsub
/tmp/repo$ hg st -dram
hg st -dram
A .hgsub
R folder/b.txt
/tmp/repo$ hg commit -m 'subrepo created'
/tmp/repo$ hg files
hg files
.hgsub
.hgsubstate
a.txt
/tmp/repo$ cd folder
/tmp/repo/folder$ hg files
hg files
b.txt
/tmp/repo/folder$ echo c >> b.txt
echo c >> b.txt
/tmp/repo/folder$ cat b.txt
cat b.txt
b
c
/tmp/repo/folder$ hg commit -m "modified c"
hg commit -m "modified c"
/tmp/repo/folder$ cd ..
cd ..
/tmp/repo$ hg files --rev 0
hg files --rev 0
a.txt
folder/b.txt
/tmp/repo$ hg co --rev 0
hg co --rev 0
abort: path 'folder/b.txt' is inside nested repo 'folder'
/tmp/repo$ hg cat --rev 0 folder/b.txt
hg cat --rev 0 folder/b.txt
b
/tmp/repo$ hg -R folder cat --rev 0 folder/b.txt
hg -R folder cat --rev 0 folder/b.txt
b
/tmp/repo$ hg -R folder cat --rev 1 folder/b.txt
hg -R folder cat --rev 1 folder/b.txt
b
c
/tmp/repo$