仅 Hg 克隆 public 次提交

Hg clone only public commits

我们有一个大型 Hg 存储库,托管在偏远地区。从此主存储库执行 hg clone 大约需要一个小时。我们通常做的加速事情是 hg serve 同事的本地 repo,hg clone http://colleague-machine,然后将 .hg/hgrc 中的 de default 路径更改为 master 的地址回购

这一切都很好,但这种解决方法有一个缺点:因为我们正在克隆开发人员的存储库,所以一些草稿提交可以与 public 一起克隆。此外,这些提交在克隆的 repo 中变为 public,使它们与其他提交无法区分。

我发现的一种可能性是 make the developer's repo non publishing,以便保留提交的阶段并在以后删除它们。另一种可能性是创建一个仅包含 public 提交的包,而不是直接克隆。

这些方法的解释和记录更为复杂。 hg clone 是否可以选择仅克隆 public 提交?我尝试使用 hg clone -r "public()",但克隆不采用 revset,只是采用常规提交标识符。或者,是否有 hg serve 仅服务于 public 提交的选项?

一种方法是使用 hg clone -r <rev>,其中 <rev> 是 public。这将确保你不会得到任何草稿提交,尽管你会错过任何不是 <rev>.

的祖先的分支

我认为没有一种通用方法可以仅克隆 public 更改。虽然可以通过服务器端扩展或进程内挂钩实现。

抛出磁盘 space 解决问题:只保留一个定期更新的本地镜像克隆。

克隆 "true master" 很慢,因为它距离较慢的 link 很远。但是更新镜像很快,因为虽然真正的主服务器距离较慢的 link 很远,但很少有数据需要遍历它;并且克隆镜像速度很快,并且可以让您了解镜像上次更新时真正主控的状态。

正如您所提到的,然后您可以只替换 default 路径(如果需要,也许 运行 随后的 hg pull 可以选择任何尚未镜像的内容)。如果你是从遥远的慢速真正的大师那里克隆出来的,那么你的新克隆就和它本来的样子一样,只是它运行得很快。


Git 内置了这种克隆,即所谓的 参考克隆 。您将 git clone 进程指向两个存储库:真实源和 "close and fast" 引用。它从真实来源获取哈希 ID,然后使用快速引用的存储来存储其数据。然后,您可以选择继续依赖参考(默认)或来自参考的 "dissociate",以便您的克隆是独立的。它需要这个分离操作,因为它可以做一个有点危险的基于路径名的"link"(在硬links的意义上不是真正的link;更多的是in-Git 类似于原始的符号 links),默认情况下这样做。

我认为 Mercurial 没有任何等价物 "out of the box"。不过,我想如果您愿意的话,作为扩展编写应该相对容易。您根本不需要 --dissociate,在硬 link 不可行的情况下,它将是默认值。

我最终使用了 hg serve 选项和 hg strip 的组合。

在现有存储库上:

hg serve --config phases.publish=False --port 0 --prefix repo-name

在目标机器上:

hg clone <address printed by `hg serve`>
cd repo-name
hg strip -r "draft()"

phases.publish=False 配置使 repo 不发布,因此保留了被克隆的提交阶段。现在阶段保留在目标机器上,克隆后很容易将它们剥离。