git:无法推送(解包器错误)与权限问题相关

时间:2010-10-26 16:25:03

标签: linux git

当我尝试推入git时,我遇到了这个问题:

error: insufficient permission for adding an object to repository database ./objects

fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To ssh://<repo url>/<repo dir>
 ! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'ssh://<repo url>/<repo dir>'

我偶尔会有这个,我们总是不得不通过每个用户sshing到repo并使用

设置所有文件的组权限来解决它
chmod -R g+w *

这从来都不是一个令人满意的解决方案,现在因为其中一个人离开而且没有人知道他的回购用户的密码,我们在屁股上咬了我们。所以,我正在努力解决它。

当有人试图推翻将改变另一个用户拥有的repo目录的更改时(因此设置上面的组写选项),似乎会发生错误。我已经做了一些谷歌搜索,并找到了几个正在讨论的解决方案(这两个解决方案都没有对我有用)

1)确保与repo dirs共享的组是每个用户的主要组(我相信已经是这样的情况:每个用户只有一个组,因此必须是他们的主要组,对吗?)< / p>

2)git repo core.sharedRepository设置,详见此处:Git: Can't push from one computer 我改变了这个但是没有任何区别。我是否需要重新加载配置或实际影响更改的内容?

这是我的repo配置看起来像atm:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
        sharedRepository = all
[receive]
        denyNonFastForwards = True

感谢任何建议或意见! 最大

13 个答案:

答案 0 :(得分:26)

更简单的方法是添加一个运行chmod命令的post-receive脚本 每次推送到服务器上的“hub”仓库之后。将以下行添加到服务器上git文件夹中的hooks / post-receive:

chmod -Rf u+w /path/to/git/repo/objects

答案 1 :(得分:19)

我有两个星期的错误,大多数解决方案都说“chmod -R”作为答案,不幸的是,我的git repos(本地/远程/共享 - 与团队)都在Windows操作系统上,即使chmod -Rv显示所有文件都改为'rwxrwxrwx',后续的'ls -l'仍然显示所有文件为'rwxr-xr-x'并且错误重复。我最终看到了Ariejan de Vroom的this solution。它起作用,我们都能够再次拉动。

在本地(推送有问题的本地)和远程repos上,运行以下命令:

$ git fsck
$ git prune
$ git repack
$ git fsck

在旁注中,我尝试使用Windows的本机文件权限/ ACL,甚至将问题用户提升为管理员,但这些似乎都没有帮助。不确定环境是否重要,但它可以帮助具有类似设置的人 - 问题团队成员和远程(Windows Server 2008 R2标准版),我的本地(Windows 7 VM)。

答案 2 :(得分:8)

这是一个权限错误。对我来说最合适和最安全的方式是回购。{3}}。由(或反之亦然)拥有:

groupadd git
chgrp -R git .git
chgrp -R git ./
usermod -G -a git $(whoami)

答案 3 :(得分:6)

  

如果其他人坚持这个:它只是意味着写   您要推送的仓库中的权限是错误的。去和chmod   -R它使您访问git服务器的用户具有写访问权。

http://blog.shamess.info/2011/05/06/remote-rejected-na-unpacker-error/

它只是有效。

答案 4 :(得分:3)

我使用gitosis来管理这种东西。 Gitosis拥有一个拥有所有存储库的用户(通常称为“git”),它对每个存储库使用基于公钥的访问控制。它可能不适合您的设置,但可能值得一试(没有双关语)。

答案 5 :(得分:3)

对我来说,当我的遥控器上的空间不足时发生了这个错误。

我只需要阅读其余的错误消息:

error: file write error (No space left on device)
fatal: unable to write sha1 file
error: unpack failed: unpack-objects abnormal exit

答案 6 :(得分:2)

对于在AWS实例上使用git存储库的权限错误,我成功创建了一个组,并将其递归地分配到存储库文件夹(-R),并为该组提供了书面权利,从而成功解决了该问题将默认的aws实例用户(ec2-user或ubuntu)分配给该组。

1。创建一个组名称share_group或其他名称

     sudo groupadd share_group

2。将存储库文件夹从“ root”组更改为“ share_group”

     sudo chgrp -R share_group /path/to/your/repository

3。将写入权限添加到share_group

     sudo chmod -R g+w /path/to/your/repository

4。最后一步是将当前用户(登录时的默认用户)(默认为ec2为“ ec2-user”,ubuntu实例的用户为aub上的“ ubuntu”,在aws上)分配给share_group。我在aws上使用ubuntu insance,所以我的默认用户是ubuntu。

     sudo usermod -a -G share_group ubuntu

顺便说一句,要查看文件夹或文件的所有权,只需键入:

    ls -l  /path/to/your/repository

'

输出:

    drwxr-x--x  2 root shared_group
(说明,请参见:https://wiki.archlinux.org/index.php/File_permissions_and_attributes)。

步骤3之后,您将看到

    drwx--x--x  2 root root

更改为

    drwxr-x--x  2 root share_group 

在这种情况下,出于安全考虑,我没有将用户“ ubuntu”分配给根组。您可以按照步骤4尝试将默认用户分配给root用户(只需跳过前3个步骤


以另一种方式,尝试通过:

    chmod -Rf u+w /path/to/git/repo/objects
它对我不起作用,我认为这应该是我的存储库文件夹属于根用户而不是Ubuntu用户的原因,默认情况下,'git'使用默认用户(ec2-user或Ubuntu用户。您可以尝试更改用户并对其进行测试。

最后,下面的代码肯定对我有用,但是777不利于安全性

    sudo chmod -R 777 /path/to/your/repo

答案 7 :(得分:1)

我也遇到了这个问题,认为我的远程gitolite-admin已损坏或出现问题。

我的设置是Mac OS X(10.6.6)笔记本电脑,带有带gitolite的远程Ubuntu 10服务器。

事实证明问题出在我的本地结帐gitolite-admin。

尽管“unpack failed”错误,但事实证明问题是本地的。

我通过再次检查它作为gitolite-admin2,做出改变和推动来解决这个问题。

瞧!它奏效了!

答案 8 :(得分:1)

在需要重新启动的Ubuntu升级后,也会出现此问题。

如果文件/var/run/reboot-required存在,请执行或安排重新启动。

答案 9 :(得分:1)

对于它的价值,我在自己的VPS上遇到了同样的问题,这是由于我在VPS上的低硬盘空间造成的。由df -h命令确认并在我清理了VPS的硬盘之后;问题消失了。

干杯。

答案 10 :(得分:0)

我遇到了类似的错误,请看下面我是如何解决的。

我的目录结构: /opt/git/project.git  和git用户是git

$ cd /opt/git/project.git
$ sudo chown -R git:git .

chown with -R选项以递归方式更改当前目录的所有权和组(因为我在上面的命令中输入了git:git)。 chown -R是必要的,因为当你推送到存储库时,git会改变git目录中的许多文件。

答案 11 :(得分:0)

在我工作的地方,我们已经在我们所有的存储库上使用这种方法几年没有任何问题(除非我们创建一个新的存储库而忘记以这种方式设置它):

  1. 在配置文件的“[core]”部分设置'sharedRepository = true'。
  2. 将存储库的组ID更改为允许推送给它的所有用户共享的组:

    chgrp -R shared_group /git/our_repos
    chmod -R g+w /git/our_repos
    
  3. 在存储库中的所有目录上设置setgid位,以便新文件/目录保持相同的组:

    find /git/our_repos -type d -exec chmod g+s {} +
    
  4. 将此行添加到存储库中的预接收挂钩,以确保新的文件权限允许组读/写:

    umask 007
    

答案 12 :(得分:0)

对我来说是权限问题:

在git服务器上,在repo目录

上运行此命令
sudo chmod -R 777 theDirectory/