我在 VPS 上托管自己的 git 存储库。假设我的用户是约翰。
我正在使用 ssh 协议访问我的 git 存储库,所以我的 url 类似于.ssh://[email protected]/path/to/git/myrepo/
Root 是其下所有内容的所有者/path/to/git
我正在尝试向 john 授予对下面所有内容的读/写访问权限/path/to/git/myrepo
我已经尝试了 和chmod
来setfacl
控制访问,但两者都以相同的方式失败:它们递归地将权限(使用正确的选项)应用于所有当前现有子目录的/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 可能会提供更好的解决方案。