Git推送错误:没有足够的权限将对象添加到存储库数据库

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

然后我在这里读到一个修正: 修复这个工作是为了下一个推动,因为所有的文件都是正确的组,但是下一次有人推动了一个改变,它在对象文件夹中创build了一个新的项目,作为小组。 我能想到的唯一的事情就是改变所有开发人员的默认组,以便他们检查的项目,但这似乎是一个黑客。 有任何想法吗? 谢谢。

修复权限

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

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

如果你没有解决这个问题的根本原因,这个错误将会持续下去,你将不得不一直重复运行上面的命令。

潜在原因

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

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

     git config core.sharedRepository 

    是不是grouptrue1或一些面具,尝试运行:

     git config core.sharedRepository group 

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

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

    core.sharedRepositorytruegroup ,Git依赖GNU操作系统的特性(例如,每个Linux发行版)来确保新创build的子目录由正确的组(所有存储库用户所在的组)拥有。 这个特性在GNU coreutils文档中有logging :

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

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

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

对于Ubuntu(或任何Linux)

从项目根,

 cd .git/objects ls -al sudo chown -R yourname:yourgroup * 

您可以通过查看ls -al命令的大部分输出的权限来确定您的名称和组应该是什么

注意:请记住sudo行尾的星号

sudo chmod -R ug+w .;

基本上, .git/objects文件没有写入权限。 上面的行授予目录中所有文件和文件夹的权限。

我只是想添加我的解决scheme。 我有一个在一些目录和家庭(这是我的用户目录)的所有权在根源上的OS X的回购上其他人导致上面列出相同的错误。

谢天谢地,解决scheme很简单。 从docker:

 sudo chown -R Home projectdirectory 

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

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

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

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

chmod g + s目录名称

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

为我解决…只是这个:

 sudo chmod 777 -R .git/objects 

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

如果你盲目地按照[1]上的指示,这可能会发生,因为你可能创build了git-user作为root,然后立即移动到git init,而不用改变之间的用户。

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

添加一些东西后…提交他们,并在所有完成后推! 砰!! 开始所有的问题…正如你应该注意到,新的和现有的项目的定义方式有一些差异。 如果其他人尝试添加/提交/推送相同的文件或内容(git保持两个相同的对象),我们将面临以下错误:

 $ git push Counting objects: 31, done. Delta compression using up to 2 threads. Compressing objects: 100% (17/17), done. Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done. Total 21 (delta 12), reused 0 (delta 0) remote: error: insufficient permission for adding an object to repository database ./objects remote: fatal: failed to write object 

为了解决这个问题,在这种情况下,你必须考虑到操作系统的权限系统,因为你受到限制。 涂更好地理解问题,继续检查你的git对象的文件夹(.git / objects)。 你可能会看到类似的东西:

 <your user_name>@<the machine name> objects]$ ls -la total 200 drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 . drwxr-xr-x 3 <his user_name> <group_name> 1024 Feb 3 15:06 .. drwxr-xr-x 2 <his user_name> <group_name> 1024 Jan 31 13:39 02 drwxr-xr-x 2 <his user_name> <group_name> 1024 Feb 3 13:24 08 

*请注意,这些文件的权限只授予您的用户,没有人不会改变它… *

 Level ugo Permission rwx rx --- Binary 111 101 000 Octal 7 5 0 

解决问题

如果您拥有超级用户权限,则可以使用第二步自行更改所有权限,而在其他情况下,则需要向所有用户请求使用其用户创build的对象,并使用以下命令来了解他们是谁:

 $ ls -la | awk '{print $3}' | sort -u <your user_name> <his user_name> 

现在你和所有文件的所有者用户将不得不改变这些文件的权限,这样做:

 $ chmod -R 774 . 

之后,您需要添加一个新的属性,该属性相当于为新存储库完成的–shared = group,根据文档,这使存储库组可写,执行:

 $ git config core.sharedRepository group 

https://coderwall.com/p/8b3ksg

对于我的情况,没有任何build议的工作。 我在Windows上,这对我工作:

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

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

/etc/inetd.d/git-gpv

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

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

Linux,macOS:

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

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

您需要对要推送的目录具有足够的写入权限。

在我的情况下: Windows 2008服务器

右键单击git repo目录或父目录。

“属性”>“共享”选项卡>“高级共享”>“权限”>确保用户具有适当的访问权限。

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

 $ sudo git push origin master 

会做的伎俩

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