如何在给定目录的任何现有或将来的子目录中向特定用户授予读/写权限?


8

我在VPS上托管自己的git存储库。假设我的用户是john。

我正在使用ssh协议访问我的git存储库,因此我的url类似于ssh://john@myserver.com/path/to/git/myrepo/

根是下面所有内容的所有者 /path/to/git

我正在尝试将john的读/写权限授予下所有内容 /path/to/git/myrepo

我都试过chmod,并setfacl控制访问,但都失败了同样的方式:他们递归应用的权利(与正确的选项),以所有当前存在的子目录/path/to/git/myrepo,但只要创建一个新的目录,我的用户不能写在新目录中。

我知道git中有钩子,使我可以在每次提交后重新应用权限,但是我开始认为我走错了路,因为对于一个非常基本的目的而言,这似乎太复杂了。

:我应该如何设置我的权利,使rw可以访问john下的任何内容,/path/to/git/myrepo并使其对树结构的更改具有弹性?

问题2:如果我应该退后一步更改一般方法,请告诉我。

编辑:问题被原样回答,但这是错误的问题。正确的问题应该是“如何在服务器上配置裸git存储库以用于ssh访问?”。看到我自己的答案。

Answers:


5

myrepousers例如,创建一个组,然后将git用户添加到该组。

然后将/ path / to / git / myrepo下的所有内容组更改为myrepousers:

chown -R .myrepousers /path/to/git/myrepo

然后修复权限:

chmod -R g+w /path/to/git/myrepo
find /path/to/git/myrepo -type d -exec chmod -R {} g+s \;

应该全部设置好。


2
如果您想了解此处发生的事情,请使用Google的“ setgid”。这里的魔力在g+s。当然,您也必须先了解其基础知识chmod
iconoclast 2012年

我以为我已经了解如何使用目录上的+ s来做到这一点,但是却没有达到我的预期:权限没有传输到新目录。last和lastrd标记的含义是:{}和\预先感谢。
塞缪尔·罗西耶

{}-是文件名替换的占位符。;是由执行的命令的终止符-exec。由于;具有特殊含义,bash因此必须使用\进行转义。看到man find详细信息
Serge 2012年

4

实际上,这是错误的方法。经过额外的研究,我发现我必须使用git的内建功能来处理存储库中文件系统的权限。

基本上可以通过的shared选项来完成,该选项git init可以(除其他外)具有以下值:

  • group:初始化存储库,以便文件和目录具有用户和组的写访问权,其他所有人都具有读访问权
  • 0660:相同,但其他用户没有读取权限。

新创建的目录和文件将自动具有正确的权限。您还可以git init在现有存储库上使用它来重新配置它,而不会丢失其内容。

所以最后我要做的是:

  • 建立群组 mygitrepo
  • 向其中添加用户
  • chmod -R git存储库 root:mygitrepo

现在,该组中的每个用户都可以拉/推,其他任何人都可以拉/推,而这不会影响文件系统权限。

git init --bare --shared=0660

有关更多信息,请http://www.kernel.org/pub/software/scm/git/docs/git-init.html


2

如果支持ACL,则可以使用默认ACL来实现。请注意,忘记这些内容很容易,因为它们在您执行时不会出现ls -l

find /path/to/git/myrepo -type d -exec setfacl -m d:u:john:rwx {} +

但是,我怀疑您可能想做一些更有条理的事情。部署乙醇钠可能会提供更好的解决方案。


1
至少在Debian Wheezy的情况下ls(我也认为Squeeze也是如此),您会+在权限结尾说一个ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert 2012年

感谢这项工作,但能否请您说明最后两个标记的含义:{} +
Samuel Rossille

这是find ... -exec cmd {} +语法,其中{}被替换为尽可能多的FOUND文件名尽可能(如oppsed到{} \;其中{}的一次只用一个找到的文件替换)
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.