将存储库转换为旧版本(没有稀疏 revlog)

Convert repository to older version (without sparse revlog)

我们的团队使用 Mercurial 进行版本控制,中央存储库位于共享网络驱动器上(即我们不使用服务器)。我们公司限制了我们可以在我们的计算机上安装什么,每个人都有 Hg 4.6 版。其中一名团队成员使用了管理员权限,他必须安装最新的 TortoiseHg (4.9)。它似乎导致中央存储库转换为最新版本。现在另一个团队成员,使用旧的 Mercurial,无法从中央存储库中拉取。它说

repository requires features unknown to this Mercurial: sparserevlog

我看了一点,好像这个功能对我们来说不是很关键。是否可以将中央存储库恢复到没有稀疏 revlog 的版本?

这是一种有点丑陋的方法(轻描淡写),但可能会起到修复作用,因为您只需执行一次...

这种方法利用了这样一个事实,即 HTTP-served HG 实例显然可以在任何内部 repo 版本之间进行互操作。

根据文档 Missing Requirement 部分 通过网络降级您的存储库:

Because all versions of Mercurial can interoperate over the network, an old client can simply pull from a repository served by a new client:

# run this on the new client
$ hg serve
listening at http://hostname:8000/ (bound to *:8000)

# run this on the old client
$ hg clone http://hostname:8000/ downgraded-repo

因为您还没有使用 hg serve,这显然不会自动为您工作。但是您也许可以暂时使用它。像这样:

  1. 在某些 PC 上设置临时 hg serve 运行ning。 (理想情况下,IT 限制不会阻止这种情况。)它应该服务于您的中央仓库。

  2. 确定所有需要修复的 repo 克隆。 (也许剔除任何不需要的东西来保存这里的工作。)这些应该只需要由 THG 4.9 客户端修改(pushed/pulled)。

  3. 备份工作。理想情况下,首先提交并推送所有可能的内容,以减少稍后恢复任何 backed-up 文件的步骤。

  4. 按照上面的示例,re-clone 从临时 hg serve PC 到所有需要的实例中的新本地克隆。

  5. 将所有 backed-up 工作恢复到新克隆(这是最糟糕的部分,可能真的很痛苦)。我认为这必须手动完成;也许有一个聪明的 diff/patch 方法会更容易。

  6. 关闭临时 hg serve 实例

请注意问题最终可能 re-propagate 向外扩展。即,如果即使一个 repo 被忽略,后来又被用来 push 到中央 repo,问题会重复出现。

备选方案/变体 - 您可以 运行 hg serve 在每个使用过 THG 4.9 的开发人员的 PC 上,并让它们各自独立于本地主机 re-clone。如果绝对必要,这可能会绕过任何 IT 限制。 (但如果您没有 IT 限制,那么 hg 服务本身在哪里并不重要 运行ning)。


如果您有大量受影响的开发者/克隆人,我不确定这种方法是最好的。一方面,如果您能够让您的 IT 人员将每个人都升级到最新的 hg 版本,那么总体上修复起来会容易得多。

通常应该可以在克隆操作期间指示 hg 不要使用特定的、更新的 repo 格式。

这里有特定的配置选项,如shown in the docs:

Config option: format

usegeneraldelta

Enable or disable the "generaldelta" repository format ... Enabled by default.

dotencode

Enable or disable the "dotencode" repository format ... Enabled by default.

usefncache

Enable or disable the "fncache" repository format ... Enabled by default.

usestore

Enable or disable the "store" repository format ... Enabled by default.

但是 出于某种原因,没有列出与最新回购格式相对应的选项,如问题中所述,该格式为“sparse-revlog”(documented here ).

但这似乎只是文档疏忽,所以,您应该能够re-clone使用类似于此的命令:

hg clone --config format.sparse-revlog=no  <source> <dest>

这将要求 hg 不使用该格式,这意味着较旧的先前格式应该是您所获得的并且将与您本地的 hg 客户端兼容。

从 Juan 的评论中添加 info/explanation:如果 (a) 您的克隆源和目标不在同一文件系统 (b) 您添加 --pull.

(默认情况下,Mercurial 会尝试创建硬链接以提高速度并 space 节省。通过克隆到不同的文件系统或不同的主机或强制克隆不在相同的主机上使用硬链接来避免硬链接使用 --pull 的文件系统将允许在没有 sparse-revlog 的情况下创建新的 repo。)

我猜你必须这样做来替换自中央仓库被意外升级以来被拉出的每个现有克隆。我会仔细计划这项工作,以确保不会丢失任何本地更改。您可以使用相同的配置选项进行本地拉取,以将提交从旧存储库转移到新存储库。

在 4.9 中,new 存储库将默认使用 sparse-revlog 创建。但是 现有存储库未受影响 。它们保持与创建时相同的格式。

避免创建存储库时的问题

为了防止升级后的用户创建 sparse-revlog 存储库,他需要在用户配置中设置以下内容 (hg config -e)

[format]
sparse-revlog = no

你对你的用户配置有全局控制吗?

正在降级现有存储库

如果要降级此类新创建的存储库,请执行以下操作:

  1. 将以下内容添加到存储库配置 (hg config -l)
[format]
sparse-revlog = no
  1. 运行 hg debugupgraderepo --run(4.7 或更新版本)

升级现有存储库

如果要升级现有创建的存储库,过程类似:

  1. 将以下内容添加到存储库配置 (hg config -l)
[format]
sparse-revlog = yes
  1. 运行 hg debugupgraderepo --run(4.7 或更新版本)

注意:页面 https://www.selenic.com/mercurial/hgrc.5.html#format 已过时。 mercurial 的网站已经 https://www.mercurial-scm.org/ 几年了。