当我尝试推到共享git远程时,我得到以下错误: 向存储库数据库添加对象权限不足

这适用于下一次推送,因为所有的文件都属于正确的组,但下一次有人推送一个更改时,它会在对象文件夹中创建一个新项目,该项目的默认组为组。我唯一能想到的就是改变所有开发人员签入项目的默认组,但这似乎是一种hack。什么好主意吗?谢谢。


当前回答

在使用git很长一段时间没有问题之后,我今天遇到了这个问题。经过一些思考,我意识到我今天早些时候把我的面具从022换成了别的东西。

其他人的所有答案都是有帮助的,例如,对有问题的目录执行chmod。但根本原因是我的新umask,每当在.git/object/下创建一个新目录时,它总是会导致一个新问题。所以,对我来说,长期的解决方案是把umask改回022。

其他回答

我将补充我的意见,作为一种发现目录中具有特定所有权的文件的方法。

该问题是由于以根用户身份运行某些git命令引起的。 收到的信息是:

$ git commit -a -m "fix xxx"
error: insufficient permission for adding an object to repository database .git/objects
error: setup.sh: failed to insert into database

我首先查看了git config -l,然后我解决了:

find .git/ -exec stat --format="%G %n" {} + |grep root

chown -R $(id -un):$(id -gn) .git/objects/

git commit -a -m "fixed git objects ownership"

调试这种情况的一个好方法是,下次发生这种情况时,SSH到远程repo, cd到objects文件夹,并执行ls -al。

如果您看到2-3个文件具有不同的用户:组所有权,那么这就是问题所在。

在过去,我遇到过一些遗留脚本访问我们的git repo,通常意味着不同的(unix)用户最后推送/修改文件,而您的用户没有权限覆盖这些文件。你应该创建一个共享git组,所有启用git的用户都在其中,然后递归地chgrp objects文件夹和它的内容,这样它的组所有权就是共享git组。

您还应该在文件夹上添加一个sticky位,以便在文件夹中创建的所有文件将始终具有git组。

Chmod g+s目录名

更新:我不知道core. sharerepository。很高兴知道这一点,尽管它可能只是做上述工作。

我只是想加入我的解。我在OS X上有一个回购,在一些目录上有根所有权,在其他目录上有Home(这是我的用户目录),这导致了上面列出的相同错误。

谢天谢地,解决办法很简单。从终端:

sudo chown -R Home projectdirectory

也有可能您添加了另一个具有相同别名的本地存储库。例如,您现在有两个本地文件夹称为origin,因此当您尝试推送时,远程存储库将不接受您的凭据。

重命名本地存储库别名,您可以通过这个链接https://stackoverflow.com/a/26651835/2270348

也许您可以留下一个您喜欢的本地存储库作为origin,而其他存储库则重命名它们,例如从origin到另一个origin。记住,这些只是别名,你所需要做的就是记住新的别名和它们各自的远程分支。

我遇到了同样的问题。阅读这里,我意识到这是文件权限的消息是指。对我来说,解决办法是:

/etc/inetd.d/git-gpv

它以“nobody”用户启动git-daemon,因此缺乏写权限。

# Who   When    What
# GPV   20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html
# GPV   20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository
#git stream tcp nowait nobody  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo
git stream tcp nowait user_git  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo

(我怀疑其他人把他们的inetd conf文件称为git-gpv。通常它会直接在/etc/inetd.conf中)