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

时间:2009-12-16 23:25:00

标签: git github

尝试对我的GitHub存储库执行“git push”时,我遇到了一个异常错误:

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进行干净的克隆后,我可以编辑/添加/提交/推送修改过的文件。
  • 如果我再次重复此操作,我会收到上述错误。
  • 我可以很好地推送到其他GitHub存储库。
  • 我已经检查了我的文件/目录权限,看起来没问题。
  • 我在Mac OS X 10.5.8上运行git 1.6.2.3

以上存储库是我之前Stack Overflow问题(SO 1904860)的乐趣之源,因此GitHub存储库可能已损坏。我通过搜索找到的唯一类似问题是在github上报告的unpack failed问题。有没有其他人遇到此问题,尤其是当使用GitHub时?

20 个答案:

答案 0 :(得分:208)

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

答案 1 :(得分:55)

通常,此问题是由Git服务器文件系统上的用户和组权限错误引起的。 git存储库必须由用户和他的组拥有。

示例:

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

然后做一个:

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

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

答案 2 :(得分:33)

sudo chmod 777 -R .git/objects

答案 3 :(得分:10)

当我尝试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/

它有效!

我当然正在用我的真实用户替换用户

答案 4 :(得分:4)

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

sudo chown -R gituser:gituser objects

答案 5 :(得分:3)

我收到此错误是因为每次用户推送某些内容时,该文件的组都会更改为该用户。然后,如果其他一些用户试图进入存储库,则会导致权限错误并且推送被拒绝。因此,需要请求您的系统管理员更改存储库的设置,以便任何用户的任何推送都不会更改存储库中任何文件的组。

要避免此类问题,请确保在初始化git存储库时使用命令“git init --shared = group”。

答案 6 :(得分:3)

奇怪的是,我在我的回购的一个克隆上遇到了这个问题,而不是我的另一个。除了重新克隆repo(同事为成功解决这个问题所做的那样)之外,我设法对失败开始之前的提交进行了“git reset”。然后我重新提交了更改,之后我才能成功推送。因此,尽管所有迹象表明服务器上存在问题,但在这种情况下,它显然表明本地回购有些奇怪。

答案 7 :(得分:2)

 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/

答案 8 :(得分:2)

你可以使用这个

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"

答案 9 :(得分:2)

尝试执行以下操作:

转到您的服务器

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

然后转到您的工作副本(本地存储库)并按git repack master

重新打包

对我来说很完美。

答案 10 :(得分:2)

sudo su root

chown -R user:group dir

dir是你的git repo。

然后做:

git pull origin master

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

答案 11 :(得分:2)

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

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

$ git config core.sharedRepository group

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

答案 12 :(得分:2)

如果在设置权限之后稍后仍然出现此错误,则可能需要修改创建掩码。我们发现我们的新提交(对象下的文件夹)仍在创建时没有组写权限,因此只有提交它们的人才能进入存储库。

我们通过将SSH用户的umask设置为002并使用所有用户共享的相应组来解决此问题。

e.g。

umask 002

其中,中间0默认允许组写。

答案 13 :(得分:1)

检查存储库:     $ 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将在不同的用户名下进行身份验证,因此会发生此错误。

答案 14 :(得分:1)

我想像我这样的很多人在上面讨论的git问题出现时会在这样的论坛中结束。然而,有很多原因可能会导致这个问题,我只是想分享是什么原因导致我的麻烦让别人学习,就像我从上面已经学到的那样。

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

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

服务器已经消失,重新建立了正确的权限设置,一切正常。

我用过

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

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

答案 15 :(得分:1)

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

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

之后检查上面帖子中描述的权限......

答案 16 :(得分:1)

由于错误涉及对象文件夹的权限,我直接在对象文件夹上做了一个chown,它对我有用。

答案 17 :(得分:1)

您是否尝试过 sudo git push -u origin --all ?有时它是您唯一需要避免此问题的方法。它会询问您输入管理员系统密码 - 您可以登录到您的计算机的密码 - 以及您需要推送或提交的密码(如果是这种情况)。

答案 18 :(得分:1)

这有效:

sudo chmod -R gituser.gituser objects

答案 19 :(得分:1)

确定 - 事实证明这是GitHub上的权限问题,发生在emi / bixo到bixo / bixo的分支期间。一旦Tekkub解决了这些问题,它就会重新开始工作。