我有一个已存在的 Git 仓库(一个裸仓库),到目前为止只有我自己有写入权限。 我想将其开放给一个 UNIX 用户组 foo,以便 foo 的所有成员都可以推送到它。 我知道可以通过以下方式轻松设置一个 新 Git 仓库:
git init --bare --shared=group repodir
chgrp -R foo repodir
但我需要现有的仓库目录进行相同的操作。
我有一个已存在的 Git 仓库(一个裸仓库),到目前为止只有我自己有写入权限。 我想将其开放给一个 UNIX 用户组 foo,以便 foo 的所有成员都可以推送到它。 我知道可以通过以下方式轻松设置一个 新 Git 仓库:
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
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")
git init --shared
命令来设置配置值。你还需要执行 chmod
命令来获取文件权限。 - Spencergit pull
等操作,结果您会收到“error: insufficient permission for adding an object to repository database .git/objects”的错误提示。我曾尝试使用find
和-type d
/type -f
修复所有错误的文件/目录的所有权,但只有这种方法才能消除错误(可能是因为某个子目录中的文件没有组写权限?) - William Turrellcore.sharedRepository
的文档应该提到这一点——如果用户没有使所有文件组可写,则它似乎是无用的。 - Sam Brightman合并@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/
)。 - Wernightchmod g+s \
find . -type d`并不具有可扩展性。请使用
find -type d -exec chmod g+s {} +`。 - hagellochmod g-w objects/*/*
这样做。但是,由于此存储库的 info 子目录为空,因此我不确定。 - Ericchmod g=u
可以省去执行 chmod g+w -R
和 chmod g+w .git/objects/pack/*
的麻烦,因为它将用户的权限应用于组的权限,无论它们是否可写。如果仓库包含只读文件或Git将来可能创建其他只读文件,这种方法更加合适。 - Daniel Böhmer在repo目录中执行以下命令:
git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir
编辑:为了解决经常出现的混淆,group
是一个实际的关键字,您不应该用组的名称替换它。
group
不是指团体的名称 :) - Pierre de LESPINAYgit config core.sharedRepository dev
并输入git config
后,我在git version 1.7.0.4
(以及可能的更新版本)中收到了以下消息:fatal: bad config value for 'core.sharedrepository' in .git/config
。 - Kzqai这可能并不是必要的,但值得指出的是,git init --bare --shared
命令还会设置 denyNonFastForwards 选项。
git config receive.denyNonFastForwards true
(来自http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration)
receive.denyNonFastForwards
如果您重新基于已经推送的提交并尝试再次推送,或者尝试将提交推送到不包含远程分支当前指向的提交的远程分支,则会被拒绝。这通常是一个好策略;但在rebase的情况下,您可能确定自己知道自己在做什么,并可以使用push命令的-f标志强制更新远程分支。
sudo usermod -a -G [groupname] [username]