And*_*rov 231 permissions users git share
我在登台服务器上有一个 Git 存储库,多个开发人员需要能够拉取到该存储库。git-init似乎有一个与我正在寻找的标志非常接近的标志:--shared,除了我也希望多个人拉到该存储库。的git-clone的--shared标志做完全不同的事情。
更改现有存储库权限的最简单方法是什么?
wom*_*ble 201
权限是害虫。
基本上,您需要确保所有这些开发人员都可以写入 git 存储库中的所有内容。
跳至 New-Wave 解决方案,了解授予一组开发人员编写能力的卓越方法。
如果您将所有开发人员放在一个专门创建的组中,原则上您可以这样做:
chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
Run Code Online (Sandbox Code Playgroud)
然后umask将用户的更改为002,以便使用组可写权限创建新文件。
这方面的问题很多。如果您使用的是假定 aumask的发行版022(例如users默认情况下拥有一个包含所有人的公共组),则这可能会在其他地方引发安全问题。迟早,有些事情会破坏您精心设计的权限方案,使 repo 停止运行,直到您获得root访问权限并修复它(即,重新运行上述命令)。
一个更好的解决方案——虽然不太好理解,并且需要更多的操作系统/工具支持——是使用 POSIX 扩展属性。我最近才来到这个领域,所以我在这里的知识并不像它想象的那么热门。但基本上,扩展 ACL 能够在 3 个默认插槽(用户/组/其他)上设置权限。
因此,再次创建您的组,然后运行:
setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX
Run Code Online (Sandbox Code Playgroud)
这为组设置了扩展 ACL,以便组成员可以读/写/访问任何已经存在的文件(第一行);然后,还告诉所有现有目录新文件应该应用相同的 ACL(第二行)。
希望这能让你上路。
小智 130
如果您创建了存储库(或从现有存储库中克隆了一个新的裸存储库)
$ git init --shared=group
Run Code Online (Sandbox Code Playgroud)
或者
$ git init --shared=0NNN
Run Code Online (Sandbox Code Playgroud)
Git 应该处理超出默认 umask 提供的权限。最后,这在我的 Git 版本(1.6.3)上是正确的。当然,这假设您的用户在同一组中。
但是,如果我需要管理具有不同读/写程度的多个组中的用户,我会选择 gitosis。我也听说过 gitolite ( http://github.com/sitaramc/gitolite ),这是一个 gitosis 分支,应该提供分支级别的权限,但不能说我个人都使用过它。
小智 56
这个还没说,想赶紧补充一下。
为确保权限问题不会引起他们的丑陋,请确保在 git 共享存储库的配置文件中设置以下内容:
[core]
sharedRepository = true
Run Code Online (Sandbox Code Playgroud)
这将确保您的系统的“umask”设置得到尊重。
jti*_*man 22
更复杂但功能齐全的共享存储库的方法是:
我们将 GitHub 用于一个由 6 名开发人员组成的团队。
小智 7
从有关设置新存储库的各种其他答案和评论中汇总一些好的建议:
如果你正在建立一个全新的回购myrepo在/srv/git该组mygroup,这是你想要什么:
mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)
mygroupcore.bare = true: 让它成为一个裸仓库core.sharedrepository = 1(同core.sharedrepository = group):repo 目录和以后在其中创建的所有目录将由 git 管理以允许mygroup读取、写入和执行权限(同时设置 sgid 位 - 以便与mygroup不属于其的用户一起工作主要组)receive.denyNonFastforwards = 1: 拒绝非快进推送到 repo如果要微调用户、组或其他用户的权限,请使用--shared=0NNN,NNN标准用户、组和其他文件位在哪里(目录上的 execute 和 sgid 位将由 git 适当管理)。例如,这允许对用户进行读写访问,以及对组的只读访问(其他人无权访问):
git init --bare --shared=0640 /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)
这允许对用户和组进行读写访问(并且不能访问其他人):
git init --bare --shared=0660 /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)
这允许对用户和组进行读写访问,以及对其他人的只读访问:
git init --bare --shared=0664 /srv/git/myrepo.git
Run Code Online (Sandbox Code Playgroud)
请注意,如果您不打算允许对该组的写访问权限,请确保首先使用chown设置存储库的所有者,然后git init以该用户身份运行该命令(以确保使用正确的所有者对存储库进行初始化)所有初始文件和子目录)。
修复共享存储库中的权限以便用户在推送时不会遇到权限问题的一种方法是创建一个更新后挂钩脚本来执行此操作。这应该适用于任何 git 版本。
假设您在 /myrepo.git 中有一个共享存储库。该存储库中的所有文件都属于mysharedgroup。推送到该存储库的所有用户也应该属于mysharedgroup。现在创建以下文件(将mysharedgroup更改为您的首选项):
/myrepo.git/hooks/post-update
#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
Run Code Online (Sandbox Code Playgroud)