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

时间:2017-12-24 12:53:34

标签: mercurial

我的仓库中有一个子文件夹,我想要提取到子库中。问题是您必须从原始仓库中删除该文件夹中的所有文件,这会在尝试更新到早期版本时产生问题。此外,如果你先输入一个subrepo,将它添加到.hgsub,然后只提交原始文件的删除,它也会从subrepo删除它们(有点令人困惑)。

有没有更好的方法告诉M​​ercurial文件已经移动到subrepo,没有变化?

1 个答案:

答案 0 :(得分:1)

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

  

将文件夹转换为子存储库

     

项目可能包含一个带有一些代码的文件夹,稍后会实现这些代码应该用于不同的项目。这个代码当然可以复制到一个存储库,项目可以作为子存储库包含在存储库中。然而,这意味着我们将丢失这些文件的宝贵历史。

     

执行此操作的方法是将文件夹转换为存储库,使用convert扩展,然后将此存储库作为不同项目中的子存储库包含。

在引用的页面以及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$