向 GitHub 推送错误-向存储库数据库添加对象的权限不足

在尝试“ git push”到我的 GitHub 存储库时,我得到了一个不寻常的错误:

Counting objects: 8, done.
Delta compression using 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 1.37 KiB, done.
Total 5 (delta 2), reused 0 (delta 0)
error: insufficient permission for adding an object to repository database ./objects


fatal: failed to write object
error: unpack-objects exited with error code 128
error: unpack failed: unpack-objects abnormal exit
To git@github.com:bixo/bixo.git
! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'git@github.com:bixo/bixo.git'
  • 在从 GitHub 完成干净的克隆之后,我可以编辑/add/commit/push 一个修改过的文件。
  • 如果我再重复一次,就会得到上面的错误。
  • 我可以很好地推送到其他 GitHub 存储库。
  • 我已经检查了我这边的文件/目录权限,它们看起来没问题。
  • 我在 Mac OS X 10.5.8上运行 git 1.6.2.3

上面的存储库是我上一个 Stack Overflow 问题(SO1904860)的乐趣之源,所以可能 GitHub 回购已经损坏了。我通过搜索发现的唯一类似的问题是 github 上报告的 拆包失败问题。以前有人遇到过这个问题吗,特别是 没有使用 GitHub 的时候?

174276 次浏览

好吧——原来是 GitHub 上的权限问题,发生在 emi/bixo 到 bixo/bixo 之间。一旦 Tekkub 修好了这些,它又开始工作了。

通常,这个问题是由于 Git 服务器文件系统上的用户和组权限错误造成的。Git 存储库必须由用户和他的组所拥有。

例如:

如果您的用户名为“ Git”,那么他的组名为“ gitgroup”,并且 Git repo 的位置是: Git@mygitserverxyz.com: path/to/repo.Git

然后做一个:

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

This fixed the git insufficient permission error for me.

这种方法是有效的:

sudo chmod -R gituser.gituser objects

当您在 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/object 时应该使用组文件权限。

Chmod 应该是 chown,因此正确的行是:

sudo chown -R gituser:gituser objects

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

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

例如:。

umask 002

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

由于该错误处理对象文件夹的权限,所以我直接对对象文件夹进行了修改,它对我很有效。

奇怪的是,我有这个问题,在一个克隆的回购,我有,但没有另一个我有。除了重新克隆回购(一个同事成功地解决了这个问题)之外,我还设法对失败开始之前的提交进行了“ git 重置”。然后我重新提交了更改,之后我就能够成功地推进了。因此,尽管所有迹象表明服务器上存在问题,但在这种情况下,显然表明本地回购中存在一些异常。

以上这些对我来说都不管用。几个小时后,我发现了问题的原因: 我使用的回购网址的类型

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

不幸的是,我存储了一个名为 example.com的腻子会话,它被配置为作为用户 myOtherUser登录。

因此,虽然我认为 Git 用用户‘ Git’连接到主机 example.com,但是 Git/TortoiseGit 已经连接到使用用户 myOtherUser的腻子会话 example.com。这会导致完全相同的 ..insufficient permission..错误(因为两个用户属于不同的组)。

解决方案: 将腻子会话 example.com重命名为 myOtherUse@example.com

当出现上面描述的 git 问题时,我猜许多像我一样的人最终都会出现在这样的论坛中。然而,有这么多的原因可能会导致问题,我只是想分享什么导致我的麻烦,让其他人学习,因为我已经从上面学到了。

我从 Sitecom 买了一个 Linux NAS (请不要从 Sitecom 购买 NAS)。我这里有一个回购,这是克隆在许多电脑上,但我突然被拒绝推动。最近我安装了一个插件,这样我的 NAS 就可以作为一个挤压箱服务器。

此服务器扫描媒体以共享。我不知道的是,可能是因为一个 bug,服务器改变了用户和组设置,以便为它查找的所有文件挤压: user。这就是所有的文件。因此改变了我必须推动的权利。

服务器不见了,正确的权限设置被重新建立,一切都工作得很完美。

我用过

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

当 myuser 和 mygroup 偏离航线时,必须为您的系统进行适当的设置。试试 git: git 或者 gituser: gituser 或者其他你可能喜欢的东西,

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

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

<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       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

解决问题

如果你拥有超级用户权限,你可以使用第二步自行更改所有权限。在其他情况下,你需要询问所有拥有与用户一起创建对象的用户,使用下面的命令来了解他们是谁:

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

现在,您和所有文件的所有者用户都必须更改这些文件的权限,如下所示:

$ chmod -R 774 .

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

$ git config core.sharedRepository group

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

检查存储库: $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@’子字符串,它指示 git 在远程服务器上作为用户名‘ git’进行身份验证。如果省略这一行,git 将在不同的用户名下进行身份验证,因此将发生此错误。

sudo su root


chown -R user:group dir

目录就是你的回购单。

然后:

git pull origin master

您将看到其他人对提交的更改。

试着这样做:

去你的服务器

    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"

在我的情况下,在我的机器和 git 虚拟服务器之间没有统一的身份验证(例如在域 + 类 AD 服务中)。因此,git 用户和组对于虚拟服务器是本地的。在我的例子中,我的远程用户(我用它来登录到远程服务器)没有被添加到远程 git 组中。

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

然后检查权限,就像上面的文章中描述的那样..。

之所以出现这个错误,是因为每次用户推送某些内容时,文件组都会更改为该用户。然后,如果其他用户试图推送到存储库中,就会导致权限错误,并且推送被拒绝。因此,需要请求 sysadmin 更改存储库的设置,这样存储库中的任何文件组就不会因任何用户的任何推送而更改。

为了避免这样的问题,请确保在初始化 git 存储库时使用“ git init —— share = group”命令。

sudo chmod 777 -R .git/objects

你试过 Sudo git push-u 原点吗?有时这是唯一能避免这个问题的方法。它会询问你的管理系统密码-你可以登录到你的机器-这就是你需要推-或提交,如果是这种情况。

这发生在我尝试 git pull的时候。一些分析表明,有人在过去使用 root 进行了提交,从而在 .git/objects中创建了一些具有 root 所有权的对象。

所以我跑了

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/

成功了!

当然,我是用我真正的用户来替换 使用者

 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/