代码之家  ›  专栏  ›  技术社区  ›  John Mee

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

  •  7
  • John Mee  · 技术社区  · 14 年前
    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很熟悉,但是当我忽视了给他许可的时候,它给鲍勃带来了一个大问题。我想我们只需要一个提交后挂钩;但只是为了包括这个症状…

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

    3 回复  |  直到 14 年前
        1
  •  14
  •   Ry4an Brase    14 年前

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

    你可以通过进入整个回购的最高级别来纠正问题。( 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 所有文件和目录。第二个命令确保所有者和组成员可以读写所有的文件和目录,并且可以降下所有的目录。第三个命令只列出目录(省略文件),然后在目录上设置stick group位。完成后,目录的权限如下: rwxrwsr-x

    您只需要这样做一次,如果您在创建repo之前这样做,那么根本不需要使用find,因为粘性组位将由所有目录继承。在过去,CVS和SVN也是这样做的。

        2
  •  3
  •   user180100    14 年前

    使用UNIX组:请参见文件系统方法 here .

        3
  •  1
  •   John Mee    14 年前

    长期来看,粘性钻头的解决方案也不起作用。

    有效的方法是将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