当我尝试推到共享git远程时,我得到以下错误: 向存储库数据库添加对象权限不足
这适用于下一次推送,因为所有的文件都属于正确的组,但下一次有人推送一个更改时,它会在对象文件夹中创建一个新项目,该项目的默认组为组。我唯一能想到的就是改变所有开发人员签入项目的默认组,但这似乎是一种hack。什么好主意吗?谢谢。
当我尝试推到共享git远程时,我得到以下错误: 向存储库数据库添加对象权限不足
这适用于下一次推送,因为所有的文件都属于正确的组,但下一次有人推送一个更改时,它会在对象文件夹中创建一个新项目,该项目的默认组为组。我唯一能想到的就是改变所有开发人员签入项目的默认组,但这似乎是一种hack。什么好主意吗?谢谢。
当前回答
适用于Ubuntu(或任何Linux)
从项目根,
cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *
你可以通过以下方式说出你的名字和你所在的小组:
# for yourname
whoami
# for yourgroup
id -g -n <yourname>
注意:记住sudo行末尾的星号
其他回答
只需复制并粘贴到您自己的终端。
sudo chown -R "${USER:-$(id -un)}" .
在我的例子中,解决方案就是git再次提交。
问题自动解决了。
发生了什么事?我使用^C (Control-C)来避免写错误的提交消息。(我从错误的剪贴板中粘贴了错误的消息。)因此,我假设进程暂时冻结在后台,这暂时锁定了数据库。
我遇到了同样的问题。阅读这里,我意识到这是文件权限的消息是指。对我来说,解决办法是:
/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中)
我遇到这个问题太多次了,但每次发生时,我都尝试使用sudo命令推送或提交,在输入密码后,我不使用sudo推送或提交 例如
sudo git commit -m "message"
然后再输入密码
git commit -m "message"
调试这种情况的一个好方法是,下次发生这种情况时,SSH到远程repo, cd到objects文件夹,并执行ls -al。
如果您看到2-3个文件具有不同的用户:组所有权,那么这就是问题所在。
在过去,我遇到过一些遗留脚本访问我们的git repo,通常意味着不同的(unix)用户最后推送/修改文件,而您的用户没有权限覆盖这些文件。你应该创建一个共享git组,所有启用git的用户都在其中,然后递归地chgrp objects文件夹和它的内容,这样它的组所有权就是共享git组。
您还应该在文件夹上添加一个sticky位,以便在文件夹中创建的所有文件将始终具有git组。
Chmod g+s目录名
更新:我不知道core. sharerepository。很高兴知道这一点,尽管它可能只是做上述工作。