推送到GitHub时出错 – 没有足够的权限将对象添加到存储库数据库

当我尝试对我的GitHub仓库进行“git push”时,我收到了一个不寻常的错误:

计数对象:8,完成。
 Delta压缩使用2个线程。
压缩对象:100%(4/4),完成。
写作对象:100%(5/5),1.37 KiB,完成。
总计5(增量2),重用0(增量0)
错误:没有足够的权限将对象添加到存储库数据库./objects

致命的:未能写入对象
错误:解压缩对象退出与错误代码128
错误:解压缩失败:解压缩对象exception退出
到git@github.com:bixo / bixo.git
  !  [remote rejected] master  - > master(n / a(unpacker error))
错误:未能推动一些裁判'git@github.com:bixo / bixo.git'
  • 从GitHub干净的克隆后,我可以编辑/添加/提交/推送修改后的文件。
  • 如果我再次重复这个,我得到上述错误。
  • 我可以推到其他GitHub仓库就好了。
  • 我检查过我的文件/目录权限,他们似乎没问题。
  • 我在Mac OS X 10.5.8上运行git 1.6.2.3

上面的存储库是我以前的堆栈溢出问题( SO 1904860 )的乐趣,所以也许GitHub 仓库损坏。 我通过search发现的唯一类似问题是在github上报告的解包失败问题。 有没有其他人遇到这个问题之前,特别是当使用GitHub?

当你看到github以外的这个错误,这是一个补救措施。

得到这个: http : //mapopa.blogspot.com/2009/10/git-insufficient-permission-for-adding.html

 ssh me@myserver cd repository/.git sudo chmod -R g+ws * sudo chgrp -R mygroup * git config core.sharedRepository true 

在这之后,git守护进程应该在写入.git / objects时使用组文件权限。

通常这个问题是由你的Git服务器文件系统的用户和组权限错误造成的。 git仓库必须由用户以及他的小组拥有。

例:

如果你的用户被称为“git”,他的组“gitgroup”和Git仓库的位置是:git@mygitserverxyz.com:path / to / repo.git

然后做一个:

  sudo chown -R git:gitgroup path / to / repo.git / 

这为我修正了git权限不足的错误。

 sudo chmod 777 -R .git/objects 

当我试图git pull这发生在我身上。 一些分析表明,有人曾经用root来提交,从而在.git/objects创build一些拥有所有权的.git/objects

所以我跑了

 cd <repo> la .git/objects/ 

并且显示了像这样的一些对象(目录)的root拥有权:

 user@host:/repo> la .git/objects/ total 540 drwxr-xr-x 135 user user 4096 Jun 16 16:29 . drwxr-xr-x 8 user user 4096 Jun 16 16:33 .. drwxr-xr-x 2 user user 4096 Mar 1 17:28 01 drwxr-xr-x 2 user user 4096 Mar 1 17:28 02 drwxr-xr-x 2 user user 4096 Jun 16 16:27 03 drwxr-xr-x 2 user user 4096 Mar 3 13:22 04 drwxr-xr-x 2 root root 4096 Jun 16 16:29 05 drwxr-xr-x 2 user user 4096 Jun 16 16:28 07 drwxr-xr-x 2 root root 4096 Jun 16 16:29 08 

然后我跑了

 sudo chown -R user:user .git/objects/ 

它的工作!

当然,我正在用真正的用户取代用户

以上都没有为我工作。 几个小时后,我发现问题的原因:我使用了types的回购url

 ssh://git@example.com/~git/repo.git 

不幸的是我存储了一个名为example.com的putty会话,它被configuration为以myOtherUser用户myOtherUserlogin。

所以,当我以为git通过myOtherUser '连接到主机example.com时,Git / TortoiseGit已经连接到使用用户myOtherUser的putty会话example.com 。 这导致完全相同的..insufficient permission..错误(导致两个用户在不同的组)。

解决scheme:将putty session example.com重命名为myOtherUse@example.com

chmod应该是chown,所以正确的行是:

 sudo chown -R gituser:gituser objects 

奇怪的是,我有一个克隆的回购我有这个问题,但我没有。 除了重新克隆repo(一个同事为了成功解决这个问题而做的),我设法做了一个“git reset”,以便在失败开始之前提交。 然后,我再次承诺这些变化,之后我就能够成功推动。 所以,尽pipe所有迹象都表明服务器上存在问题,但在这种情况下,显然是在本地回购中出现了一些怪异现象。

我得到这个错误,因为每次用户推送一些内容,文件的组更改为用户。 然后,如果其他用户试图推入存储库,它会导致权限错误,推送被拒绝。 所以你需要询问你的系统pipe理员来改变版本库的设置,这样任何用户的任何推送都不会改变版本库中的任何文件组。

为了避免这样的问题,请确保当你初始化你的git仓库时,使用命令“git init –shared = group”。

如果您设置权限仍然遇到此错误则可能需要修改创build掩码。 我们发现我们的新提交(对象下的文件夹)仍然是在没有组写入权限的情况下创build的,因此只有提交者可以将其推入存储库。

我们通过将SSH用户的umask设置为002来解决这个问题,所有用户共享一个适当的组。

例如

 umask 002 

中间0是默认允许组写入。

添加一些东西后…提交他们,并在所有完成后推! 砰!! 开始所有的问题…正如你应该注意到,新的和现有的项目的定义方式有一些差异。 如果其他人尝试添加/提交/推送相同的文件或内容(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

尝试做如下:

去你的服务器

  cd rep.git chmod -R g+ws * chgrp -R git * git config core.sharedRepository true 

然后去你的工作副本(本地存储库),并重新由git repack master

对我完全作品。

你可以使用这个

 sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git" 
 sudo su root chown -R user:group dir 

目录是你的git回购。

然后做:

 git pull origin master 

你会看到其他人提交的更改。

行 – 事实certificate,这是一个权限问题GitHub发生在emi / bixo到bixo / bixo的分歧。 一旦Tekkub解决这些问题,它就开始工作了。

由于error handling对象文件夹的权限,我直接在对象文件夹上做了一个chown,它对我很有帮助。

这工作:

 sudo chmod -R gituser.gituser objects 

我想很多像我这样的论坛在上面提到的git问题引起争议时就会结束。 然而,有太多的原因可能导致这个问题,我只是想分享一下是什么导致我的麻烦让别人学习,因为我已经从上面学到了。

我从sitecom的Linux NAS上获得回购(从不从Sitecom购买NAS,pleeaaase)。 我在这里有一个在许多计算机上克隆的回购,但是我突然被拒绝了。 最近我安装了一个插件,以便我的NAS可以作为一个挤压服务器。

此服务器扫描媒体共享。 我不知道的是,可能由于一个错误,服务器将用户和组设置更改为挤压:用户查看所有文件。 这就是所有文件。 从而改变了我不得不推动的权利。

服务器不见了,适当的权利设置重新build立,一切正常。

我用了

 chmod -R g+ws * chown -R <myuser>:<mygroup> * 

myuser和mygroup off- course必须用您的系统的适当的设置replace。 尝试git:git或gituser:gituser或其他你可能会喜欢的东西。

检查存储库:$ git remote -v

 origin ssh://git@example.com:2283/srv/git/repo.git (fetch) origin ssh://git@example.com:2283/srv/git/repo.git (push) 

请注意,这里有一个'git @'子string,它指示git在远程服务器上authentication为用户名'git'。 如果你省略这一行,git将在不同的用户名下进行身份validation,因此会发生此错误。

在我的情况下,我的机器和git虚拟服务器之间没有统一的身份validation(例如,在域+类似AD的服务中)。 因此,git用户和组是本地的虚拟服务器。 在我的情况下,我的远程用户(我用来login到远程服务器)只是没有添加到远程git组。

 ssh root@<remote_git_server> usermod -G <remote_git_group> <your_remote_user> 

之后,检查权限,就像它在上面的post中所述…

你有没有尝试sudo git push -u origin –all ? 有时候,这是你需要避免这个问题的唯一方法。 它要求你inputpipe理员系统密码 – 可以login到你的机器上的密码 – 这就是你需要推送或者提交的东西,如果是这样的话。

  user@M063:/var/www/html/app$cd .git/objects user@M063:/var/www/html/app/.git/objects$ sudo chmod 777 -R .git/objects user@M063:/var/www/html/app/.git/objects$ sudo chown -R user:user .git/objects/ 

在你的项目中设置权限:

 sudo chmod -R 777 .git/