hg clone是否相当于hg(init→pull)?

3
在工作中,我使用共享给7个人的svn存储库。为了避免我的提交错误和破坏每个人的构建,并避免在svn中进行分支,我在我当前正在工作的svn目录的一部分中创建了一个hg存储库。随着工作的进行,我在hg上执行本地提交,并且由于我把这些全部设置在虚拟机上,所以我甚至将我的hg存储库推送到私有集中位置。最近我迁移到了Mac OS X lion,这破坏了我的虚拟机,所以我不得不重新设置它。因此,我从我的svn主干检出了项目,现在想在我正在工作的目录中获取hg更改集。我有两个选择:$ hg clone 和 $ hg init && hg pull 。这两种方法等效吗?
2个回答

14

唯一的区别是,如果你运行hg init && hg pull <remote>,那么你还必须:

  1. 运行hg update default来检出一个工作副本
  2. 手动设置默认的pushpull路径

hg clone可以在一条命令中完成所有这些操作。


+1 我输了。**:)** -- 而且 Vaibhav 可能需要执行 hg update --clean - Joel B Fant
谢谢!!!我一直在寻找如何禁用hg clone的默认路径。 - Krazy Glew

4

是的,也不完全是。

我知道你的问题表明你正在使用一个远程仓库作为源,但问题的标题有点更广泛,所以我回答更广泛的问题。

看起来明显的最终结果是相同的。虽然两个仓库中的文件不是二进制相同的(注意,我不是在谈论你跟踪的文件,我是在谈论Mercurial用于跟踪这些文件的“数据库”),但历史记录、变更集等都是相同的。

因此,在这方面,是的,它们似乎做了同样的事情。

但是,它们使用不同的方式。

如果你这样做:

hg clone REMOTE_URL
hg init && hg pull REMOTE_URL

那么实际上并没有真正的区别。

然而,如果您这样做:

hg clone LOCAL_PATH
hg init && hg pull LOCAL_PATH

(注意,此克隆/拉取是从您的磁盘上的另一个存储库进行的)

那么就可能会有所不同。如果可能的话,本地克隆将使用硬链接来连接存储库。换句话说,您不是在存储库中创建新的独立文件副本,而是为它们在磁盘上创建新的链接,这样运行速度更快,需要的空间几乎为零。

然后,当您开始修改历史记录,即提交新的变更集时,这些文件将被取消链接并作为全新的副本进行复制,以满足按需基础的需求。

请注意,我不知道用于对哪些文件进行硬链接和哪些文件不进行硬链接的确切启发式。您可以在Mercurial维基中阅读有关此功能的更多信息,硬链接克隆

拉取将不会这样做。它将从其他存储库中读取并在目标存储库中创建/更新新文件。这需要更多时间和更多磁盘空间。

因此,总结一下:

  • hg clone LOCAL_PATH 可以比 hg init && hg pull LOCAL_PATH 使用更少的磁盘空间并运行得更快。
  • 如果您正在从远程存储库进行克隆/拉取,则没有真正的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接