推送到GitHub时出错-权限不足,无法将对象添加到存储库数据库


126

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

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

致命:无法编写对象
错误:解包对象已退出,错误代码为128
错误:解压缩失败:解压缩对象异常退出
到git@github.com:bixo / bixo.git
 ![远程拒绝]主机->主机(不适用(拆包错误))
错误:无法将一些引用推送到'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上报告的解压缩失败问题。之前有人遇到过这个问题吗,尤其是在使用GitHub时?



1
出现此错误的另一个提示是:我收到此错误是因为我使用了错误的用户进行推送。我的服务器有用户foogit;两者都可以读取/opt/git/<repo>,但只能git写入。git如果未提供,则默认为当前用户.git/config,我忘记了。下面的详细答案都没有必要。
塞巴斯蒂安2014年

Answers:


209

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


4
+1对我们有用。的“目的”是sudo chmod -R g+ws *什么?
Erik B

5
这将允许其他用户创建的任何新文件维护根目录的组权限。否则,您将无法上载到存储库。参见setuid和setgid
syvex 2011年

我在Debian 6和PHPStorm IDE上遇到了Gitorious相同的错误,并显示以下消息:“错误:权限不足,无法将对象添加到存储库.git / objects中。” 我在项目的父文件夹上使用了此解决方案,可以很好地与“ + s技巧”一起使用。

3
repo-config已过时。应该是git config core.sharedRepository true
lpapp 2014年

4
注意:如果使用通配符“ ”,则隐藏文件和文件夹(例如.git!)可能不会受到影响!因此,如果上述方法不适合你的工作,运行./.git的命令,以及
奔Rogmans

54

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

例:

如果您的用户名为“ git”,则其组为“ gitgroup”,并且Git存储库的位置为:git@mygitserverxyz.com:path / to / repo.git

然后执行:

须藤chown -R git:gitgroup路径/到/repo.git/

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


执行chown:无效的用户:'混帐:混帐”
艾伦Coromano

4
@MariusKavansky尝试使用$ USER:$ USER代替git:git
dwurf

就我而言,这仅适用于一段时间。经过一些推动后,我必须重做它。
BuZZ-dEE

这是最好的答案,但是您应该说可以将chown限制为“ .git / objects”,而您称为“ git”的用户就是您登录时使用的用户。git服务器是否知道用户这一事实并不重要。
Tristan

34
sudo chmod 777 -R .git/objects

4
这对我有用...但是WTF?我已经在更新
仓库

对我来说,解决方法几乎相同,但是涉及到更改/更正.git目录中某些文件的所有者。我以“ root”身份登录时进行了一些git维护,这似乎将所有者更改为root或使用git所依赖的root所有者创建了一些新文件。我在“ apache”所有者下运行了一个自动部署脚本,该脚本随后停止工作。
coatesap

9
chmod 777永远不是一个好的解决方案,只是一个不安全的解决方法。尝试使用@Syvex的答案(使用setgid)
4wk_

10

当我试图去做时,这发生在我身上git pull。一些分析表明,过去有人使用root进行过提交,因此在中创建了一些具有root所有权的对象.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/

而且有效!

当然,我是用我的真实用户替换用户


4

以上对我没有任何作用。几个小时后,我找到了问题的原因:我使用了以下类型的存储库网址

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

不幸的是,我存储了一个腻子会话,其名称example.com配置为以user身份登录myOtherUser

因此,尽管我认为git example.com使用用户git连接到主机,但Git / TortoiseGit已连接到example.com使用User 的腻子会话myOtherUser。这将导致完全相同的..insufficient permission..错误(因为两个用户都在不同的组中)。

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


4

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

sudo chown -R gituser:gituser objects

3

奇怪的是,我在一个存储库的克隆中遇到了这个问题,但我没有另一个。除了重新克隆存储库(同事已成功解决此问题),我还对失败之前的提交进行了“ git reset”。然后,我重新提交了更改,然后我就可以成功推送了。因此,尽管有各种指示,但服务器上还是有问题,在这种情况下,显然表明本地存储库中存在一些异常。


3

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

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


更多的解释,你可以看到链接stackoverflow.com/questions/16183345/...
阿伦·乔杜里

2

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

我们通过将SSH用户的umask设置为002(由所有用户共享的适当组)来解决此问题。

例如

umask 002

默认情况下,中间的0允许组写入。


您确定在Unix或Linux中有这样的命令吗?因为我可以肯定umask不是特定于位置的。
Jan Hudec 2012年

是的,很抱歉您说对了-我不知道为什么我认为它有一个额外的目录参数。它仅适用于用户。我已经更新了评论。
scipilot 2012年

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 = group,根据文档,这使存储库组可写,请执行以下操作:

$ git config core.sharedRepository group

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


2

尝试执行以下操作:

转到您的服务器

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

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

对我来说效果很好。


2

你可以用这个

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

1
这是在做什么 你能补充说明吗?
Anubian Noob 2014年

这将获取您的存储库的顶级目录,因此无论您当前在存储库中的位置如何,该命令都将起作用。$ USER git的:如果你的根是已经你只可以运行须藤乔敦- R的$ USER
谭谭

将其编辑为您的问题。否则,您的问题将毫无用处。
Anubian Noob 2014年

2
sudo su root

chown -R user:group dir

目录是您的git仓库。

然后做:

git pull origin master

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



1

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


发生了什么,您如何解决?我知道是前一段时间...有什么想法吗?
传记作者2012年

1
这是GitHub方面的问题-所以我不知道他们到底做了什么,只是GitHub上的“ Tekkub”说“我已修复权限”,然后它起作用了。
kkrugler 2012年

凉。谢谢(你的)信息。我结束了重新克隆仓库的工作。次优,但它起作用。干杯!
传记作者2012年

4
我们,呃,我们解决了小故障。这样他就不会再收到薪水了,所以它会自然地工作。
艾伦

1

由于该错误涉及对象文件夹的权限,因此我直接在对象文件夹上执行了chown,它对我有用。


1

这有效:

sudo chmod -R gituser.gituser objects

1
否。chmod更改文件权限,并需要模式作为参数,而不是用户和组。是chmod -R ${some_octal_num} blachown -R ${some_user}:${some_group} bla
丹尼斯(Dennis Winter)

1

我猜当如上所述的git问题出现时,许多像我一样的人最终会进入这样的论坛。但是,有太多原因可能导致这个问题,我只想分享从我上面已经学到的东西,让其他人学习我的麻烦。

我有来自sitecom的Linux NAS上的存储库(请不要从Sitecom购买NAS,pleeaaase)。我在这里有一个可复制到许多计算机上的存储库,但突然被拒绝推送到该存储库。最近,我安装了一个插件,以便我的NAS可以用作squeezebox服务器。

该服务器扫描要共享的媒体。我不知道的是,由于错误,服务器可能会将其查找的所有文件的用户和组设置更改为squeeze:user。那就是所有文件。因此改变了我不得不推动的权利。

服务器不见了,正确的权限设置重新建立,一切正常。

我用了

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

必须使用系统的正确设置替换myuser和mygroup偏离路线的位置。尝试git:git或gituser:gituser或其他您可能喜欢的东西,


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将使用不同的用户名进行身份验证,因此将发生此错误。


1

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

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

之后,请检查上述帖子中所述的权限...


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.