2

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

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

PS:我从 2010 年开始只在 SO 上找到这样这样的答案,我不确定答案是否仍然适用于 FB 投入的所有努力。

4

2 回答 2

5

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

对于工作流程,我建议在谷歌上搜索monorepo. 它有其优点和缺点,您需要了解您的情况和当前的工作流程来决定。对于性能和扩展,请继续阅读。

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

  • 远程文件日志。这给你一些概念上类似于浅克隆的东西。这减少了hg clone时间hg pull
  • fsmonitor(以前称为hgwatchman,现在是 mercurial 核心的一部分)。这大大减少了本地操作的时间,例如hg status. 请注意,fsmonitor它独立于remotefilelog. 您可以开始对此进行试验,因为它不需要在服务器端进行任何设置。

使用最近的 mercurial(我强烈建议),您可以使用CommandServer + CHg减少 Python 解释器的额外启动时间。

一些附加说明:

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

附加信息:

于 2016-09-07T08:55:32.883 回答
0

我不确定答案是否仍然适用于 FB 投入的所有努力

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

remotefilelog 本质上允许按需进行浅层克隆(因此您不会一直获取所有内容的历史记录),但您仍然可以获取所需版本的所有 repo 目录的基本元数据并进行结帐。

使用 Mercurial,我可以签出子目录(SVN 中的 li[k]e)吗?如果是这样,怎么做?

https://stackoverflow.com/a/40355673/7836056讨论了如何使用第三方扩展来允许窄/稀疏结帐(Facebook 的sparse.py)或窄克隆(谷歌的 NarrowHG)与 Mercurial,因此只能从内部“创建”单个目录主存储库(尽管有完全不同的权衡)。

(注意措辞很重要:“稀疏签出”是指在引用分布式版本控制时非常具体的操作,而在使用它来引用集中式版本控制时不存在)

于 2017-04-08T07:20:31.263 回答