如何设置权限,以便两个用户可以在同一个hg存储库上工作?

时间:2010-05-17 04:54:26

标签: mercurial

Ubuntu: Jaunty  
Mercurial: 1.3.1  
Access: ssh  (users john and bob)  
File permission:   -rw-rw----  1 john john  129276 May 17 13:28 dirstate  
User: bob  
Command: 'hg st'  
Response:  

**abort: Permission denied: /our/respository/.hg/dirstate**

显然mercurial不能让bob看到状态,因为它需要读取的文件属于我。

所以我更改权限以允许bob读取文件,一切都很好,直到我下次尝试做某事,从而情况发生逆转。现在他拥有该文件,我无法阅读。

所以我建立了一个“提交者”组,并且john和bob都属于该组,但是无论何时提交一个或其他提交,仍然可以使用所有权和权限。

此外,只要我们中的一个或另一个人将文件添加到存储库,该文件就由提交者专有。我很好,因为我对chmod很熟悉,但是当我忽略了允许他的时候,这是一个很大的问题。我想我们只需要一个post-commit钩子;但只是包括这个症状...

我们如何配置它,以便同一组中的两个不同的登录可以通过ssh提交到同一个存储库?

3 个答案:

答案 0 :(得分:14)

您需要在所有相关目录上设置“group sticky bit”。该权限位表示在这些目录中创建的任何文件或目录应该具有父目录组的组所有权,而不是创建用户的主要组的组所有权。

您可以通过转到整个仓库(hg root)的顶层并运行以下命令来设置正确的事项:

chgrp -R committers .
chmod -R ug+=rwX .
find . -type d -print0 | xargs -0 chmod 2775   # or 2770 if other can't read

第一个命令将组所有权返回给committers所有文件和目录。第二个命令确保所有者和组成员可以读取和写入所有文件和目录,并且可以下载所有目录。第三个命令仅列出目录(省略文件),然后在其上设置棒组位。完成后,目录的权限将如下所示:rwxrwsr-x

您只需要执行一次,如果在创建repo之前执行此操作,则根本不需要使用find,因为粘性组位将由所有目录继承。在过去的日子里,CVS和svn以同样的方式完成。

答案 1 :(得分:3)

使用unix组:请参阅文件系统方法here

答案 2 :(得分:1)

长期以来粘性位解决方案也不起作用。

有用的是将chmod / chgrp命令放入bash脚本并教导设计人员如何运行它。

#!/bin/bash
chgrp -R foo /foo/development/templates
chgrp -R foo /foo/development/media
chgrp -R foo /foo/development/static

chmod -R g+w /foo/development/templates
chmod -R g+w /foo/development/media
chmod -R g+w /foo/development/static