我对mercurial很新,我在这个主题上已经阅读了很多,但我一直无法找到明确的答案。
The mercurial guide说:“为了提高效率,只要源和目标位于同一文件系统上,就会使用硬链接进行克隆(请注意,这仅适用于存储库数据,而不适用于工作目录)。”
Repository wiki page说:“与存储库根目录中的.hg目录共存的所有文件和目录都被认为存在于工作目录中。”
现在,要在主回购中“链接”一个subrepo:
hg init main
cd main
echo subrepo = ../subrepo > .hgsub
hg clone ../subrepo subrepo # (1)
hg add
hg ci -m "initial rev of the main repo"
上面的定义是否意味着当我执行(1)时,我实际上正在创建subrepo
的副本?或者我只创建../subrepo
的符号链接?根据{{1}}的输出,它是一个实际的副本。但这对我来说听起来很奇怪......如果有人能对这个问题有所了解,我会很感激。
答案 0 :(得分:6)
首先,Mercurial的那部分,我不是专家,但这就是我所理解的。
不,您没有创建指向整个目录的链接。相反,文件内部是硬链接。
这意味着磁盘上的空间被保留以保持目录结构分离,但文件都是相同的,因为它们只是被克隆,因此它们被构造为返回原始文件的链接。
当您开始通过add
或commit
(ci
)命令操作存储库时,Mercurial会破坏硬链接,并根据需要为每个链接构建单独的文件。
现在,这纯粹是技术性的,你不需要知道或关心这一点。如果它更容易,只需将克隆视为原始存储库的完整副本,单独的文件和所有这些。硬链接部分只是为了保存相同的磁盘空间。
由于典型的项目有很多文件,而典型的变更集只会更改一些文件,而克隆的典型原因是你要做一组固定的更改,因为许多文件中的硬链接都是有意义的。存储库目录在存储库的生命周期内将与原始目录完全相同。
对于那些没有的人,Mercurial会为你默默处理所有这些。
答案 1 :(得分:2)
让我们首先看一下克隆时不会谈论子存储库时会发生什么。当你这样做
$ hg clone A B
然后Mercurial会为A/.hg/store/data
内的文件设置硬链接。因此,如果跟踪了名为x
的文件,那么在克隆之后您将看到
A/.hg/store/data/x.i
和
B/.hg/store/data/x.i
是硬链接 - 这意味着这两个文件名实际上是指相同的文件。正如Lasse所指出的那样,这很聪明,因为您可能永远不会对x
克隆进行更改,因此没有理由为x.i
和{{1}创建两个不同的A
文件克隆。另一个优点是,制作硬链接比复制文件要快得多,特别是如果B
非常大:硬链接是一个恒定的时间操作。
在上面的示例中,您将向x.i
存储库添加子存储库subrepo
。子存储库由两部分组成:
子库本身。这是你在做什么时创造的
main
子库存元数据。这是您存储在$ hg clone ../subrepo
文件中的内容。您必须告诉Mercurial您想要子存储库的位置以及Mercurial可以从哪里克隆它。
您询问是否复制或符号链接存储库,并且您确实复制(克隆)了它,因为您已经使用.hgsub
进行了确认。之后,您向Mercurial添加了一些元数据,告诉它可以找到子存储库的位置。这与普通文件系统意义上的符号链接无关,它只是Mercurial的一些元数据。