push语法 - Git推送错误:将对象添加到存储库数据库的权限不足




git push语法 (11)

修复权限

在确定并修复了潜在的原因后(请参阅下文),您需要修复权限:

cd /path/to/repo.git
chgrp -R groupname .
chmod -R g+rwX .
find . -type d -exec chmod g+s '{}' +

如果你没有解决根本原因,那么错误将会持续回来,你将不得不一直重复运行上述命令。

根本原因

错误可能是由下列之一引起的:

  • 存储库未配置为共享存储库(请参阅git help config core.sharedRepository )。 如果输出:

    git config core.sharedRepository
    

    不是group或者true或者1或者某个面具,尝试运行:

    git config core.sharedRepository group
    

    然后重新运行递归chmodchgrp (请参阅上面的“修复权限”)。

  • 操作系统不会将目录上的setgid位解释为“所有新文件和子目录都应该继承组所有者”。

    core.sharedRepositorytruegroup ,Git依靠GNU操作系统(例如,每个Linux发行版)的功能来确保新创建的子目录由正确的组(所有存储库用户所在的组)拥有。 GNU coreutils文档中记录了此功能:

    ... [如果]设置了目录的set-group-ID位,新创建的子文件继承与目录相同的组,并且新创建的子目录继承父目录的set-group-ID位。 ... [这种机制可以让用户]更轻松地共享文件,减少使用chmodchown共享新文件的需要。

    但是,并不是所有的操作系​​统都有这个功能(NetBSD就是一个例子)。 对于这些操作系统,您应该确保所有Git用户拥有相同的默认组。 或者,您可以通过运行git config core.sharedRepository world来使存储库具有git config core.sharedRepository world可写性(但要小心 - 这不太安全)。

  • 文件系统不支持setgid位(例如,FAT)。 ext2,ext3,ext4都支持setgid位。 据我所知,不支持setgid位的文件系统也不支持组所有权的概念,因此无论如何所有文件和目录都归同一个组所有(哪个组是挂载选项)。 在这种情况下,确保所有Git用户都在拥有文件系统中所有文件的组中。
  • 并非所有的Git用户都在拥有存储库目录的同一个组中。 确保目录上的组所有者是正确的,并且所有用户都在该组中。

当我尝试推送到共享的git远程时,出现以下错误: insufficient permission for adding an object to repository database

然后我在这里阅读有关修复的信息: Fix此问题适用于下一次推送,因为所有文件都是正确的组,但下次有人推送更改时,它会在对象文件夹中创建一个具有其默认组的新项目作为小组。 我能想到的唯一的事情就是改变开发者的所有默认组件,但这看起来像是一种黑客攻击。 有任何想法吗? 谢谢。


Linux,macOS:

cd .git/
sudo chown -R name:group *

其中name是您的用户名, group是您的用户名所属的组。


为我解决......只是这样:

sudo chmod 777 -R .git/objects

你可能会意外地嵌套git仓库 ! 这是此错误最常见的来源。


如果您运行的git init与您计划在推送更改时使用的其他用户不同,那么很容易发生这种情况。

如果你盲目地按照[1]中的说明进行操作,会发生这种情况,因为你可能以root用户身份创建了git-user,然后立即转移到git init而不更改用户之间的用户。

[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server


对.git执行以下命令:

chmod -R 777 .git


对于我的情况,没有任何建议起作用。 我在Windows上,这对我有用:

  • 将远程回购复制到另一个文件夹中
  • 共享文件夹并给予适当的权限。
  • 确保您可以从本地机器访问该文件夹。
  • 将此回购添加为您当地回购的另一个远程回购。 ( git remote add foo //SERVERNAME/path/to/copied/git
  • 推到foo。 git push foo master 。 它有效吗? 大! 现在删除不工作的回购,并将其重新命名为以前的内容。 确保权限和共享属性保持不变。

尝试推送IDE时出现此错误(在本例中为PHPStorm)。 当我尝试使用终端(OSX)时,它确实有效! 所以,这显然是一个权限问题。 虽然我无法找到如何永久解决它,使用

$ sudo git push origin master

会做的伎俩


我只是想添加我的解决方案。 我在OS X上有一个回购站,它在某些目录和Home(这是我的用户目录)上拥有root权限,导致上面列出的同一错误。

谢天谢地,解决方案很简单。 从码头:

sudo chown -R Home projectdirectory

我遇到了同样的问题。 在这里阅读时,我意识到这是邮件所指的文件许可权。 对我来说,修正是在:

/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中)


调试它的一个好方法是下次发生这种情况,SSH进入远程仓库,cd进入objects文件夹并执行ls -al

如果你看到2-3个文件与不同的用户:组所有权比这是问题。

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

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

chmod g + s目录名称

更新:我不知道core.sharedRepository。 很高兴知道,虽然它可能只是做到了上述。





push