仅 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 不发布,因此保留了被克隆的提交阶段。现在阶段保留在目标机器上,克隆后很容易将它们剥离。
我们有一个大型 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 不发布,因此保留了被克隆的提交阶段。现在阶段保留在目标机器上,克隆后很容易将它们剥离。