我们所有的开发人员都可以通过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?
首先要理解这里没有魔法。Mercurial总是以它运行时的用户身份创建文件,仅此而已。它不会尝试(甚至没有权限)做任何其他事情。
这意味着如果您只通过sudo运行hg,并且现有文件的权限是正确的,它将在这里执行您想要的操作。
但是这也意味着如果用户在没有sudo的情况下运行hg,并且他们有正确的权限,他们将会弄得一团糟。Mercurial满足于让您执行Unix权限模型允许的任何操作。
有三种方法来处理这个问题:
- 用尺子拍打指关节,直到人们一直使用sudo
- 使用像mercurial-server这样的包装器,将所有用户汇集到一个帐户
- 正确配置组、umask、所有权和权限,以便实际共享
最后的工作方式如下:
- 确保每个用户X都有一个匹配的默认组X(大多数现代系统已经这样做了)
- 将每个人(和wwwdata)添加到二级组项目-foo
- 确保每个人的umask在登录时设置为NOT掩码组读写(umask 007,而不是077)
- 将项目中的所有文件设置为组项目foo (chgrp -R project-foo foo/)
- 让所有的文件由这个组读/写(chmod -R g+rw foo/)
- 使所有目录可遍历和setgid(查找foo/-type d | xargs chmod g+sx)
这将确保每次用户在项目中创建文件时,该组中的其他所有人都可以读/写。