1

我们所有的开发人员都可以通过 ssh 登录到我们的登台服务器。

当他们hg在登台服务器上运行任何命令时,它使他们成为更新/新文件的所有者。我需要这些文件归用户/组 www-data 所有。

我尝试将 sudoers 文件编辑为此

Cmnd_Alias WWW_DATA_CMDS = /usr/bin/svn, /usr/bin/hg

%developers  ALL=(www-data) NOPASSWD: WWW_DATA_CMDS

如您所见,我们在服务器上也有 SVN(我们正在从 SVN 转移到 HG),并且此设置适用于 SVN,如果我们运行 SVN 命令,它会将文件创建为 www-data

我怎样才能在 Mercurial 工作?

4

1 回答 1

2

首先要明白这里没有魔法。Mercurial 始终以它运行的用户身份创建文件,故事结束。它不会尝试(甚至没有权限)做任何其他事情。

这意味着如果你只通过 sudo 运行 hg,并且现有文件的权限是正确的,它会在这里做你想做的。

但这也意味着,如果用户在没有 sudo 的情况下运行 hg,并且他们拥有正确的权限,他们就会弄得一团糟。Mercurial 满足于让您做 Unix 权限模型允许的任何事情。

有三种方法来处理这个问题:

  • 用尺子拍指关节,直到人们一直使用 sudo
  • 使用像 mercurial-server 这样的包装器,将所有用户集中到一个帐户中
  • 正确配置组、umask、所有权和权限,以便实际共享内容

最后一个工作如下:

  • 确保每个用户 X 都有一个匹配的默认组 X(大多数现代系统已经这样做了)
  • 将所有人(和 wwwdata)添加到辅助组 project-foo
  • 确保每个人的 umask 在登录时都设置为 NOT 屏蔽组读/写(umask 007,而不是 077)
  • 将项目中的所有文件设置为组项目 foo (chgrp -R project-foo foo/)
  • 使该组的所有文件读/写(chmod -R g+rw foo/)
  • 使所有目录可遍历并设置gid (find foo/ -type d | xargs chmod g+sx)

这将确保每次用户在项目中创建文件时,该组中的其他人都可以读/写该文件。

于 2011-10-07T17:07:24.027 回答