Answers:
尝试这样做,以使repodir
group中的用户可以使用现有的存储库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
命令以正确获取文件的权限。
git pull
以root身份而不是www-data
所有者身份或其他身份进行某事而陷入困境,那么确认这一点也很有帮助error: insufficient permission for adding an object to repository database .git/objects
。我以为可以使用find
和-type d
/ 修复所有错误的文件/目录的所有权type -f
,但是只有这种方法可以消除错误(可能是因为某些子目录中的文件不是组可写的?)
core.sharedRepository
会提到这一点-如果用户不将其所有文件组都写为可写,这似乎毫无用处。
在repo dir中执行以下命令:
git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir
编辑:要解决经常造成的混乱,这group
是一个实际的关键字,您不应将其替换为组的名称。
group
小组的名称
git config core.sharedRepository dev
输入之后(可能是之后的版本),git config
我进入fatal: bad config value for 'core.sharedrepository' in .git/config
了git version
1.7.0.4
git config core.sharedRepository group
group
不是组名,而是实际值!
合并@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/
)
find . -type d
'引发错误unable to execute /bin/chmod: Argument list too long
chmod g+s `find . -type d`
它无法缩放。使用find -type d -exec chmod g+s {} +
chmod g-w objects/*/*
。我不确定info子目录,因为该存储库为空。
这可能不是必需的,但值得指出的是,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)