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

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

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

我正在使用 ssh 协议访问我的 git 存储库,所以我的 url 类似于.ssh://[email protected]/path/to/git/myrepo/

Root 是其下所有内容的所有者/path/to/git

我正在尝试向 john 授予对下面所有内容的读/写访问权限/path/to/git/myrepo

我已经尝试了 和chmodsetfacl控制访问,但两者都以相同的方式失败:它们递归地将权限(使用正确的选项)应用于所有当前现有子目录/path/to/git/myrepo,但是一旦创建了新目录,我的用户就无法在新目录中写入。

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

:我应该如何设置我的权利,让 rw 访问 john 下的任何内容/path/to/git/myrepo,并使其能够适应树结构的变化?

Q2:如果我应该退一步改变一般方法,请告诉我。

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

答案1

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 g+s {} \;

应该都准备好了。

答案2

事实上,这是错误的做法。经过额外的研究,我发现就我而言,我必须使用 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了解更多信息。

答案3

如果支持 ACL,您可以使用默认 ACL 来执行此操作。请注意,很容易忘记这些,因为当您执行ls -l.

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

但是,我怀疑您可能想做一些更有组织性的事情。部署 gitolite 可能会提供更好的解决方案。

相关内容