如何配置现有的 git 存储库以供 UNIX 组共享

问题描述 投票:0回答:5

我有一个现有的 git 存储库(一个裸露的存储库),到目前为止只有我可以写入。 我想将其开放给某个 UNIX 用户组 foo,以便 foo 的所有成员都可以推送到它。 我知道我可以轻松地设置一个new git repo:

git init --bare --shared=group repodir
chgrp -R foo repodir

但是我需要对现有存储库目录进行等效操作。

git permissions share shared
5个回答
131
投票

尝试使用此方法使

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")

57
投票

合并@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)。

50
投票

在 repo 目录中执行以下命令:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

编辑:为了解决经常出现的混淆,

group
是一个实际的关键字,您不应该将其替换为组的名称。


3
投票

这可能不是必需的,但值得指出的是

git init --bare --shared
还设置了 denyNonFastForwards 选项。

git config receive.denyNonFastForwards true

该选项含义如下:

receive.denyNonFastForwards

如果您对已经推送的提交进行变基,然后尝试推送 再次,或者尝试将提交推送到远程分支 不包含远程分支当前指向的提交, 你会被拒绝。这总体来说是个好政策;但在这种情况下 变基后,您可能会确定自己知道自己在做什么并且可以 使用 -f 标志强制更新远程分支到您的推送命令。

(来自 http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration


1
投票

除了上述允许组读/写的答案之外,您还需要将用户添加到组中(例如“foo”)。

sudo usermod -a -G [groupname] [username]

注意:如果用户不存在,则必须先创建用户

© www.soinside.com 2019 - 2024. All rights reserved.