我有一个现有的 git 存储库(一个裸露的存储库),到目前为止只有我可以写入。 我想将其开放给某个 UNIX 用户组 foo,以便 foo 的所有成员都可以推送到它。 我知道我可以轻松地设置一个new git repo:
git init --bare --shared=group repodir
chgrp -R foo repodir
但是我需要对现有存储库目录进行等效操作。
尝试使用此方法使
repodir
中的现有存储库为组中的用户工作 foo
:
chgrp -R foo repodir # set the group
chmod -R g+rw repodir # allow the group to read/write
find repodir -type d -exec chmod g+s {} + # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")
合并@David Underhill和@kixorz答案,我制定了自己的(最终)解决方案。
它适用于 bare 存储库和 non-bare 存储库。它们之间只有很小的区别,但这样就更清楚了。
裸存储库
cd <repo.git>/ # Enter inside the git repo
git config core.sharedRepository group # Update the git's config
chgrp -R <group-name> . # Change files and directories' group
chmod -R g+w . # Change permissions
chmod g-w objects/pack/* # Git pack files should be immutable
find -type d -exec chmod g+s {} + # New files get directory's group id
地点:
<repo.git>
是裸存储库目录,通常位于服务器上(例如 my_project.git/
)。<group-name>
是 git 用户的组名称(例如 users)。非裸存储库
cd <project_dir>/ # Enter inside the project directory
git config core.sharedRepository group # Update the git's config
chgrp -R <group-name> . # Change files and directories' group
chmod -R g+w . # Change permissions
chmod g-w .git/objects/pack/* # Git pack files should be immutable
find -type d -exec chmod g+s {} + # New files get directory's group id
地点:
<project_dir>
是包含 .git
文件夹的项目目录。<group-name>
是 git 用户的组名称(例如 users)。在 repo 目录中执行以下命令:
git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir
编辑:为了解决经常出现的混淆,
group
是一个实际的关键字,您不应该将其替换为组的名称。
这可能不是必需的,但值得指出的是
git init --bare --shared
还设置了 denyNonFastForwards 选项。
git config receive.denyNonFastForwards true
该选项含义如下:
receive.denyNonFastForwards
如果您对已经推送的提交进行变基,然后尝试推送 再次,或者尝试将提交推送到远程分支 不包含远程分支当前指向的提交, 你会被拒绝。这总体来说是个好政策;但在这种情况下 变基后,您可能会确定自己知道自己在做什么并且可以 使用 -f 标志强制更新远程分支到您的推送命令。
(来自 http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration)
除了上述允许组读/写的答案之外,您还需要将用户添加到组中(例如“foo”)。
sudo usermod -a -G [groupname] [username]
注意:如果用户不存在,则必须先创建用户