2011-08-04 165 views
3

在工作中,我使用svn存储库共享7人。hg克隆相当于hg(init→pull)

为了避免困扰我的错误与提交,并打破了建立适用于所有人,以避免svn分支,我有一个在svn目录我目前工作的一部分创建一个hg库。

我对汞进行本地提交,因为我的工作,因为我有这样的一个虚拟机上的所有设置,我甚至推着我的hg库私人集中的位置。

最近我迁移到了Mac OS X lion这打破了我的虚拟机,所以我不得不重新设置它。所以我从我的svn trunk中检出了项目,现在想在我正在处理的目录中找回hg更改集。

我有两个选择:

  • $ hg clone <remote repo>
  • $ hg init && hg pull <remote repo>

这是等价?

回答

13

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

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

hg clone在一个命令中完成了所有这些。

+0

+1击败我。 **:)** - Vaibhav可能需要执行'hg update --clean'。 –

+0

谢谢!!!!我一直在寻找如何禁用hg克隆的默认路径。 –

4

嗯,是的,没有。

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

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

所以在这方面,是的,这两个似乎做同样的事情。

但是,他们以不同的方式做到这一点。

如果你这样做:

hg clone REMOTE_URL 
hg init && hg pull REMOTE_URL 

再有就是没有真正的区别。

但是,如果你这样做:

hg clone LOCAL_PATH 
hg init && hg pull LOCAL_PATH 

(注意,这个克隆/拉从另一个存储库已经在你的硬盘上)

再就是可能的差异。如果可能,本地克隆将使用存储库的硬链接。换句话说,你并没有为存储库中的所有文件创建一个新的独立副本,而是为它们创建了磁盘上的新链接,这些链接运行得非常快,并且几乎不需要空间。

然后,当你开始修改历史,即。提交新的变更集,这些文件将被取消链接,并按照需求进行完整复制。

请注意,确切的启发式文件,它不会做这样的硬链接是我不知道的。您可以在Mercurial wiki,Hardlinked Clones中阅读有关此功能的更多信息。

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

所以总结:

  • hg clone LOCAL_PATH可以占用更少的磁盘空间,并运行一大堆比hg init && hg pull LOCAL_PATH
  • 更快如果你克隆/从远程仓库拉,没有真正的差异