我正在通过 SSH 与朋友共享 git 存储库。他使用我机器的 SSH 服务器(共享 git 存储库所在的位置)从他的 git 存储库推送和拉取。
问题是,当他推送提交时,我无法拉取,因为提交是janito users rwx------
(这些是权限元数据)。
我创建了一个名为 git 的组,添加了他和我自己,存储库是jpmelos git rwxrwx---
.如何强制在存储库目录中创建的文件也是如此<creator> git rwxrwx---
,以便我们始终可以拉动和推送而不用担心权限?
当然,或者您可以提出更好的问题解决方案。限制是我们需要在我的机器上使用 SSH(我们还没有准备好公开代码),并且我们已经从我与工作存储库分开创建的裸存储库中进行推送和拉取。
谢谢!
答案1
umask 问题可以通过 Git 配置变量来解决core.sharedRepository
:
( cd /path/to/shared-repository.git &&
git config --bool core.sharedRepository true
)
每当 Git 创建新文件或目录时,它都会确保组位设置正确(在适当的情况下始终组可读、组可写和可执行 - 即使调用用户的 umask 过于“宽”)。
注意:该core.sharedRepository
设置仅适用于 Git 本身创建的条目,因此它无助于设置非裸存储库工作树中条目的权限。您必须为此手动设置 umask。
git
您可以通过设置来使新文件和目录归您的组所有目录上的 setgid 位(chgrp
将文件和目录添加到适当的组后)。
chgrp -R git /path/to/shared-repository.git &&
find /path/to/shared-repository.git -type d -exec chmod g=rwxs '{}' \;
如果您从头开始创建一个新的存储库,您可以只创建chgrp
一个空目录并git init --shared
在其上运行(Git 将在 GIT_DIR 上设置core.sharedRepository
并执行操作):chmod g=rwxs
mkdir new-shared.git &&
chgrp git new-shared.git &&
git init --bare --shared new-shared.git
答案2
你朋友的 umask 设置是什么?让他umask
在您的服务器上的命令提示符下键入内容,看看会出现什么结果。如果它读取0077
(或077
),则可能是问题所在,因为这意味着“创建文件时,清除组或其他组的所有权限位”。
更合适的 umask 是0027
,它将允许对创建的文件进行组读取和执行权限。他可以通过运行临时设置它umask 0027
,或者通过将其添加到他的~/.profile
或来永久设置~/.bash_profile
。
答案3
我认为这可以通过编写自定义脚本作为 Git 挂钩来完成——任何脚本语言都可以,只要克隆 Git 存储库的每个人都可以使用它。在 Pro Git 上了解有关 Git 挂钩的信息。
答案4
其他需要考虑的事项:
pam_umask
要使用 pam 来控制 umask,请UsePAM yes
在 sshd_config 中进行设置,并在/etc/pam.d/sshd
:
session optional pam_umask.so umask=0027
访问控制列表
读吉尔斯的帖子在这里。它包括安装说明。我不知道这是否是一个愚蠢的问题,但该页面值得一读:-)
要修复现有存储库中的 acl:
find git_repository/ -type d -exec setfacl -m d:g:git:rwx {}
find git_repository/ -f -exec setfacl -m g:git:rwx {}
又快又脏:钩子
如前所述创建一个钩子,编辑git_repository/hooks/post-update
为:
#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R git . 2>/dev/null
这会在每次更新后修复问题,并且对于小型存储库和 2 个用户来说可能会很好。可能不适合较大、繁忙的存储库;-)