Mercurial 稀疏结帐

Mercurial sparse checkout

在 2015 年的F8 conference video(从 8:40 开始)中,他们谈到了使用 Mercurial 和跨 facebook 的单一存储库的优势。

这在实践中如何运作?使用 Mercurial,我可以签出一个子目录(位于 SVN 中)吗?如果是这样,如何?我需要 facebook-mercurial-extension 这个

P.S.: 我只在 SO 上找到了 2010 年的 this or this 之类的答案,我不确定这些答案是否仍然适用于 FB 投入的所有努力。

从你的问题来看,不清楚你是在寻找工作流程(monorepo 与 multiple repos 辩论)还是为了巨大 代码库的性能和扩展。

对于工作流程,我建议使用谷歌搜索 monorepo。它有利有弊,你需要了解你的情况和当前的工作流程来决定。对于性能和扩展,请继续阅读。

remotefilelog 的想法不是检出一个子目录(如您所说),而是检出所有内容。为了以有效的方式做到这一点,您需要 Facebook 积极开发的两个扩展:

  • remotefilelog。这在概念上为您提供了类似于浅层克隆的东西。这减少了 hg clonehg pull 时间。
  • fsmonitor(以前叫hgwatchman,现在是mercurial core的一部分)。这大大减少了 hg status 等本地操作的时间。请注意 fsmonitor 独立于 remotefilelog。您可以开始试验这个,因为它不需要在服务器端进行任何设置。

使用最近的 mercurial(我强烈建议),您可以使用 CommandServer + CHg.

减少 Python 解释器的额外启动时间

一些补充说明:

  • 我进行了广泛的测试fsmonitor。它工作得很好,在巨大的回购上 hg status 的时间从 10 秒减少到不到 1 秒(这 1 秒的大部分是 Python 启动时间,见上文 CHg).如果您的存储库真的很大,您可能需要微调一些 inotify 内核参数(或 MacOSX 上的等效参数)。 fsmonitor 文档包含您需要的所有信息。
  • 我没有测试 remotefilelog,尽管我阅读了我找到的所有关于它的信息并且我确信它有效。取决于开发的完成方式(每个人是否始终连接互联网,组织是否有自己的主存储库)可能需要注意:它将去中心化的 hg 部分转换为中心化的 VCS,如 svn:一些通常可以离线完成的操作(例如:hg log 和过去对变更集的第一个 hg update)现在需要连接到主存储库。
  • 在考虑 remotefilelog 之前,我在一个巨大的 repo 上广泛使用了 largefiles 扩展。它具有与 remotefilelog 相同的缺点,并且对于想要使用 hg 只是为了完成任务而不花时间了解其工作原理的用户来说,存在一些令人困惑的极端情况。如果我要管理另一个大型存储库,我会使用 remotefilelog 而不是 largefiles,尽管它们的用例并不完全相同。
  • Mercurial 还支持 subrepositories (doc1, doc2)。问题是它会根据您在源代码树中的位置更改 hg 的行为。同样,如果开发人员不关心真正理解 hg 的工作原理,那将是太混乱了。

附加信息:

i am not sure if the answers still apply with all the efforts FB put into it

(2017 年初)链接问题中的答案仍然适用(因为它们偶尔会更新)但请注意,您必须阅读所有评论和答案。

remotefilelog 本质上允许按需浅克隆(因此您不会一直获取所有内容的 history),但您仍然可以获取必要的元数据并检出,所需修订版本的回购协议的所有目录。

Using Mercurial, can i checkout a subdirectory (li[k]e in SVN)? If so, how?

讨论了如何使用第三方扩展来允许 narrow/sparse 结帐(Facebook 的 sparse.py)或窄克隆(Google 的 NarrowHG)与 Mercurial 因此只有 "creating" 主存储库中的一个目录(尽管有完全不同的权衡)。

(注意措辞问题:"sparse checkout" 表示以一种非常具体的方式引用分布式版本控制时使用它来引用集中式版本控制时不存在的方式)