Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial 如何将子文件夹转换为子存储库?_Mercurial - Fatal编程技术网

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

Mercurial 如何将子文件夹转换为子存储库?,mercurial,Mercurial,我的repo中有一个子文件夹,我想将其解压缩到子repo中。问题是您必须从原始repo中删除该文件夹中的所有文件,这将在尝试更新到早期版本时产生问题。此外,如果您首先初始化了子repo,将其添加到.hgsub,然后才提交原始文件的删除,那么它也将从子repo中删除它们(有点混乱) 有没有更好的方法告诉Mercurial文件已移动到子repo,且未更改?保持正常的关键是Mercurial的转换功能。基本方法总结如下: 将文件夹转换为子存储库 一个项目可能包含一个包含一些代码的文件夹,稍后会意识到这

我的repo中有一个子文件夹,我想将其解压缩到子repo中。问题是您必须从原始repo中删除该文件夹中的所有文件,这将在尝试更新到早期版本时产生问题。此外,如果您首先初始化了子repo,将其添加到
.hgsub
,然后才提交原始文件的删除,那么它也将从子repo中删除它们(有点混乱)


有没有更好的方法告诉Mercurial文件已移动到子repo,且未更改?

保持正常的关键是Mercurial的
转换功能。基本方法总结如下:

将文件夹转换为子存储库

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

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

更多详情见引用页面,以及

如果是一个选项,那么你可以考虑使用<代码>转换< /代码>两次,将原来的回购分成两个,包括所选的文件(有历史记录),另一个不包括它们。

说明性文字记录(仅调用一次
convert
/tmp$mkdir回购
/tmp$cd回购
/tmp/回购$hg初始
/tmp/repo$echo a>a.txt
/tmp/repo$mkdir文件夹
/tmp/repo$echo b>文件夹/b.txt
/tmp/回购$hg addremove
hg添加删除
添加a.txt
添加文件夹/b.txt
/tmp/repo$hg commit-m init
/tmp/repo$(echo包含文件夹;echo重命名文件夹。)>map.txt
/tmp/repo$hg convert--filemap.txt。次级回购
正在初始化目标子repo存储库
扫描源。。。
分类。。。
转换。。。
0初始化
/tmp/回购$cd子回购
/tmp/repo/subrepo$hg更新
1个文件已更新,0个文件已合并,0个文件已删除,0个文件未解析
/tmp/repo/subrepo$find。
.
./b.txt
./.hg
/tmp/回购/次级回购$cd。。
/tmp/repo$hg rm文件夹/b.txt
/tmp/repo$文件文件夹
文件夹
文件夹:无法打开“文件夹”(没有这样的文件或目录)
/tmp/回购$ls
a、 txt map.txt subrepo
/tmp/repo$mv子回购文件夹
/tmp/repo$echo folder=folder>.hgsub
/tmp/回购$hg add.hgsub
/tmp/回购$hg st-dram
hg st-dram
A.hgsub
R文件夹/b.txt
/tmp/repo$hg提交-m“已创建子回购”
/tmp/repo$hg文件
hg文件
hgsub先生
.亚州
a、 文本
/tmp/repo$cd文件夹
/tmp/repo/folder$hg文件
hg文件
b、 文本
/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“修改的c”
hg commit-m“修改的c”
/tmp/repo/文件夹$cd。。
光盘
/tmp/repo$hg文件——版本0
hg文件--版本0
a、 文本
文件夹/b.txt
/tmp/回购$hg公司——第0版
hg-co——第0版
中止:路径“folder/b.txt”位于嵌套的repo“folder”内
/tmp/repo$hg目录--rev 0文件夹/b.txt
hg cat--rev 0文件夹/b.txt
B
/tmp/repo$hg-R文件夹目录--rev 0文件夹/b.txt
hg-R文件夹目录--rev 0文件夹/b.txt
B
/tmp/repo$hg-R文件夹目录--rev 1文件夹/b.txt
hg-R文件夹目录--rev 1文件夹/b.txt
B
C
/tmp/回购美元

谢谢!这肯定会派上用场,尽管它只解决了一半的问题。它确实将文件提取到子repo中,保留变更集。但这并不能防止母公司回购协议出现混乱。对于新子回购中的每个文件,
hg status
报告它已被删除。尝试对这些文件执行任何操作(如
忘记
它们)都会导致:
中止:路径“某某”位于嵌套的repo“new subrepo”内
。有什么办法可以避免这种情况吗?首先,正如我所说,如果是我的回购协议,我可能会把它分成两部分,正如我在文章最后一段提到的。第二,我认为你可能按错误的顺序做事。我将附上一份记录,说明事情确实做得很好。特别要注意的是,在“转换”之后,可以查看(即cat)顶级文件夹中处于先前状态的文件b.txt,但不可能从顶级回购中“签出”,因为hg可以识别冲突。奇怪的是,这与我尝试过的方法差不多,但不起作用。“不”或“没有”?  有不止一种方法可以做到这一点,但也很容易尝试以错误的顺序做事。。。。
/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$