如何将子文件夹转换为子修订版



我的存储库中有一个子文件夹,我想提取在子repo中。问题在于,您必须从原始存储库中提交该文件夹中所有文件的删除,这将在尝试更新到较早的修订时会产生问题。此外,如果您首先对Subrepo进行了插入,则将其添加到.hgsub,然后提交原始文件的删除,它也会从Subrepo中删除它们(有点令人困惑)。

有没有更好的方法告诉mercurial文件已移至子repo,没有变化?

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

将文件夹转换为子修订版

一个项目可能包含一个带有某些代码的文件夹,稍后将实现该文件夹,应在不同的项目中使用。当然,该代码可以仅复制到一个存储库,项目可以将其包含为子修订版。但是,这意味着我们会失去这些文件的宝贵历史。

这样做的方法是将文件夹转换为存储库,使用转换扩展名,然后将此存储库作为子重复库中的不同项目。

在引用页面以及https://www.mercurial-scm.org/wiki/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$ 

最新更新