subrepo,hg clone和symlinks

时间:2010-12-08 17:53:25

标签: mercurial subrepos

我对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}}的输出,它是一个实际的副本。但这对我来说听起来很奇怪......如果有人能对这个问题有所了解,我会很感激。

2 个答案:

答案 0 :(得分:6)

首先,Mercurial的那部分,我不是专家,但这就是我所理解的。

不,您没有创建指向整个目录的链接。相反,文件内部是硬链接。

这意味着磁盘上的空间被保留以保持目录结构分离,但文件都是相同的,因为它们只是被克隆,因此它们被构造为返回原始文件的链接。

当您开始通过addcommitci)命令操作存储库时,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。子存储库由两部分组成:

  1. 子库本身。这是你在做什么时创造的

    main
  2. 子库存元数据。这是您存储在$ hg clone ../subrepo 文件中的内容。您必须告诉Mercurial您想要子存储库的位置以及Mercurial可以从哪里克隆它。

  3. 您询问是否复制或符号链接存储库,并且您确实复制(克隆)了它,因为您已经使用.hgsub进行了确认。之后,您向Mercurial添加了一些元数据,告诉它可以找到子存储库的位置。这与普通文件系统意义上的符号链接无关,它只是Mercurial的一些元数据。