【问题标题】:Mercurial HG Update Exited With Status 255Mercurial HG 更新退出,状态为 255
【发布时间】:2010-11-03 19:31:49
【问题描述】:

远程更新 Mercurial 存储库时,我收到来自推送后远程服务器上正在运行的 hg update 命令的以下错误。我在网上四处寻找一些帮助,但是没有找到任何有用的东西。在这一点上,我希望对导致此问题的原因有一些想法和/或见解。

错误就在下面。它发生在推送两个变更集时。一个变更集包括一个不相关的 index.html 文件更改。另一个变更集是一个合并,其中包括对 index.html 的更改以及两个图像文件的重命名。

levinaris@server01:/home/web/repository$ hg push
推送到 ssh://10.10.1.12//home/web/repository
搜索更改远程:添加更改集
远程:添加清单
远程:添加文件更改
远程:添加了 2 个变更集,其中 1 个更改为 1 个文件
远程:中止:不允许操作:/home/web/repository/html/images/image.gif
远程:警告:更改组挂钩以状态 255 退出

其他细节:

  • 两个图像的大小都是 10385 字节。 (是的,这个错误发生在我有的两张图片上)

  • 在尝试将存储库拉入 Windows PC 时,由于大小写冲突,这两个映像在已推送的变更集中和 hg updated 中更改了名称。

  • 目标服务器在/etc/mercurial/hgrc中有如下钩子:

    [钩子]
    更改组 = hg 更新
  • 作为一种变通方法,我执行了以下操作:

    1. 已删除 image.gif。
    2. 删除了另一个产生错误的图像文件。
    3. hg update - 成功!
    4. hg revert html/image/image.gif
    5. hg revert html/image/otherimage.gif

此时,我正试图更好地了解此问题的原因,以便确保在我的环境中实现可靠、易于使用的实施。非常感谢您的帮助!


在钩子中使用hg --debug update后,我收到了这个输出:

levinaris@server01:/home/web/repository$ hg push 推送到 /home/web/staging/repository 寻找变化 添加变更集 添加清单 添加文件更改 添加了 2 个变更集,其中 1 个更改为 1 个文件 解决清单 覆盖 False 部分 False 祖先 58a5edb95c9a 本地 58a5edb95c9a+ 远程 3aafb97b148c 搜索回到第 6 版的副本 html/index.php: 远程更新 -> g html/images/otherimage.gif.casefolding:更新权限-> e html/images/image.gif: 更新权限 -> e 中止:不允许操作:/home/web/staging/repository/html/images/image.gif 警告:changegroup 钩子以状态 255 退出

其他权限信息:

  • 2 个变更集中的所有 3 个文件都拥有 webuser:dev user:group 的 775 权限。

  • 我的全局 hgrc 文件的网络用户受信任

    [信任]
    用户 = 网络用户

【问题讨论】:

  • 可能有问题的文件存在权限问题?
  • 基于调试输出,我不得不同意。我附加了有关服务器权限的详细信息。请让我知道您对如何解决此权限问题的想法。
  • 此评论显示了一些混乱“2 个变更集中的所有 3 个文件对 webuser:dev user:group 具有 775 权限”。变更集中的文件没有文件权限(执行除外)或用户或组——这些元数据不被 mercurial 跟踪,因此它们不是变更集中文件的一部分。磁盘上的文件,无论是 .hg 还是工作目录中的文件,都将拥有所有权和权限,仅取决于谁在运行编写它们的 mercurial 命令。在您的示例中,这是“levinaris”,而不是网络用户。
  • 这是有道理的。我指的是文件的权限,因为它们出现在 linux 服务器的文件系统上。当它声明“更新权限-> e”时,调试输出指的是什么?
  • (续)如果 levinaris 不是超级用户,该用户将无法创建 webuser:dev 文件或 chmod 文件。但是,您可以使用粘性组位将任何新文件上的组设置为“dev”,如果您的 umask 在 7775 创建内容,这可能就足够了。

标签: mercurial permissions


【解决方案1】:

是否有可能该文件在服务器上的权限使得执行推送的人无法篡改它?

例如,如果两个不同的人完成了推送(并因此更新)第二个人将无法覆盖由第一个人的推送触发更新创建的文件。

也许尝试将钩子更改为此进行测试(实际上你的钩子上并没有那些单引号,对吧?):

[hooks]
changegroup = hg --debug update

如果是权限问题,通常的解决方法是将要推送和更新的每个人都放在同一个组中(我叫我的“hg”),然后在 repo 中的所有目录上使用粘性组位来制作确保新文件具有该组。

【讨论】:

  • 我将编辑原始帖子。我在配置文件或错误输出中没有这些反引号。在这里格式化我的帖子是一个错误。
  • 我对权限不肯定... 更新没有问题的文件和导致“中止”错误的文件在文件系统上都具有相同的权限:由网络用户拥有,在开发组中。我应该检查其他权限吗?也许是 Mercurial 特有的东西?
  • 我将hg --debug update 的结果附加到我的原始帖子中。请告诉我你的想法。谢谢。
  • 我正在参与 cmets 的问题,但我想我们会到达那里。这当然看起来像是权限。
  • 再次感谢您的帮助。事实证明,已经在服务器上放置了一个 cron,它每五分钟左右更改一次文件的权限和所有者。我猜 cron 在运行推送/更新时碰巧运行,从而导致了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2013-03-13
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多