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

时间:2019-05-16 14:26:54

标签: mercurial

我们的团队正在使用Mercurial进行版本控制,其中央存储库位于共享的网络驱动器上(即,我们未使用服务器)。我们公司限制了我们可以在计算机上安装的内容,每个人的汞版本均为4.6。团队成员之一使用管理员权限,必须安装最新的TortoiseHg(4.9)。看来导致中央存储库被转换为最新版本。现在,另一个具有旧版Mercurial的团队成员无法从中央存储库中撤出。它说

  

存储库需要此Mercurial未知的功能:sparserevlog

我读了一些有关它的内容,看来此功能对我们而言并不重要。是否可以将中央存储库还原为版本而无需稀疏的revlog?

3 个答案:

答案 0 :(得分:4)

对于4.9,默认情况下将使用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已过时。商业网站已经https://www.mercurial-scm.org/了两年了。

答案 1 :(得分:1)

这是一种丑陋(轻描淡写)的方法,但可能可以解决,因为您只需要执行一次...

这种方法利用了一个事实,即HTTP服务的HG实例显然可以在任何内部回购版本之间进行互操作。

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

  

由于所有版本的Mercurial都可以通过网络进行互操作,   老客户只需从新客户提供的存储库中提取   客户:

# 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。 (理想情况下,IT限制不会阻止这种情况。)它应该为您的中央存储提供服务。

  2. 标识回购的所有需要​​修复的克隆。 (也许可以剔除不需要在此处保存工作的任何对象。)这些只需由THG 4.9客户端修改(推/拉)即可。

  3. 备份工作。理想情况下,请先提交并推送所有可能的内容,以减少以后还原所有备份文件的步骤。

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

  5. 将所有备份的工作还原到新克隆中(这是最糟糕的部分,可能确实很痛苦)。我认为这必须手动完成;也许有一个聪明的差异/补丁方法会更容易。

  6. 关闭临时hg serve实例

请谨慎考虑该问题最终可能再次向外传播。也就是说,即使忽略了一个回购协议,后来又使用它推送到中央回购协议,问题也会重演。

替代/变化-您可以在每台使用THG 4.9的开发人员的PC上运行hg serve,并让它们分别从本地主机重新克隆。如果绝对必要,这可能会克服任何IT限制。 (但是,如果您没有IT限制,那么hg服务本身在哪里运行并不重要)。


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

答案 2 :(得分:0)

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

对此有一些特定的配置选项,例如shown in the docs

  

配置选项:usegeneraldelta

dotencode
     

启用或禁用“ generaldelta”存储库格式...启用者   默认。

usefncache
     

启用或禁用“ dotencode”存储库格式...启用者   默认。

usestore
     

启用或禁用“ fncache”存储库格式...启用者   默认。

hg clone --config format.usesparserevlog=0  <source> <dest>
     

启用或禁用“存储”存储库格式...启用者   默认。

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

不确定,也许这只是文档监督。

假设是这样({希望),并且based on the answer to another question,则可以使用类似于以下命令来重新克隆:

usesparserevlog

如果{{1}}选项存在并被识别,它将要求hg不要使用该格式,这意味着较早的先前格式应该是您所获得的,并且将与本地hg客户兼容。

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