如何配置要由UNIX组共享的现有git repo


98

我有一个现有的git repo(一个裸露的仓库),到目前为止,这个仓库只能由我写。我想向某些UNIX用户组foo开放它,以便foo的所有成员都可以推送到它。我知道我可以使用以下命令轻松设置新的 git repo:

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

但是我需要对现有的回购目录进行等效的操作。


4
在ServerFault(另一个StackOverflow网站)上,对于这个问题很好的答案
Zearin 2012年

Answers:


114

尝试这样做,以使repodirgroup中的用户可以使用现有的存储库foo

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # 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")

14
我要补充一点,您可能还应该在存储库的配置中设置config.sharedRepository = true。 kernel.org/pub/software/scm/git/docs/git-config.html
Pistos 2010年

1
这与我自己所做的非常接近,但是我想获得一些外部确认。谢谢。:)我也希望会有一个git clone --shared = group之类的东西,但是clone的--shared选项做的事情完全不同。
Pistos

5
您可以git init --shared在现有存储库上使用该命令来设置配置值。您还需要执行chmod命令以正确获取文件的权限。
Spencer 2012年

1
如果您因为某人git pull以root身份而不是www-data所有者身份或其他身份进行某事而陷入困境,那么确认这一点也很有帮助error: insufficient permission for adding an object to repository database .git/objects。我以为可以使用find-type d/ 修复所有错误的文件/目录的所有权type -f,但是只有这种方法可以消除错误(可能是因为某些子目录中的文件不是组可写的?)
William Turrell

1
用户的umask似乎仍然适用于新创建的文件。那是您所期望的吗?我认为的文档core.sharedRepository会提到这一点-如果用户不将其所有文件组都写为可写,这似乎毫无用处。
Sam Brightman

47

在repo dir中执行以下命令:

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

编辑:要解决经常造成的混乱,这group是一个实际的关键字,您不应将其替换为组的名称。


25
group小组的名称
不在

7
目标文件和打包文件应该是不变的。他们应该具有权限444 / r--r--r--。
CB Bailey

3
在尝试git config core.sharedRepository dev输入之后(可能是之后的版本),git config我进入fatal: bad config value for 'core.sharedrepository' in .git/configgit version 1.7.0.4
Kzqai 2013年

3
git config core.sharedRepository group group不是组名,而是实际值!
kixorz

如果您犯了使用组名而不是“ group”的错误,只需在文本编辑器中打开.git / config并编辑core.sharedRepository行以说出“ group”即可。
汤姆(Tom)

43

合并@David Underhill@kixorz的答案,我制定了自己的(确定的)解决方案。

它用于仓库和仓库仓库。它们之间只有很小的差异,但是这种方式更加清晰。

裸仓库

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)的组名。

正如查尔斯所说,也可以这样做:(chmod g-w objects/pack/*如果是非裸仓库,则在前面.git/
2015年

在这里,我们如何找到组名或如何创建组名?
苏吉拉索

'chmod g + s find . -type d'引发错误unable to execute /bin/chmod: Argument list too long
Dr.X Dr. X

正如@ Dr.X指出的那样,chmod g+s `find . -type d`它无法缩放。使用find -type d -exec chmod g+s {} +
hagello

我认为所有松散的对象也应该基于预共享状态为只读。也许像chmod g-w objects/*/*。我不确定info子目录,因为该存储库为空。
埃里克(Eric)

3

这可能不是必需的,但值得指出的是,git init --bare --shared它还设置了denyNonFastForwards选项。

git config receive.denyNonFastForwards true

该选项的含义如下:

receive.denyNonFastForwards

如果您将已经推送的提交重新设置为基准,然后再次尝试推送,或者尝试将提交推送到不包含该远程分支当前指向的提交的远程分支,则会被拒绝。这通常是好的政策;但是如果是重新设置基准,您可以确定自己知道自己在做什么,并且可以使用-f标志强制更新远程分支到push命令。

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


1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.