git: 由于权限问题,无法推送(解包器错误)

71
我在尝试推送到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>'

我以前偶尔遇到过这个问题,我们总是不得不通过每个用户通过ssh访问仓库,并在其中的所有文件上设置组权限来解决它。
chmod -R g+w *

这从来都不是一个令人满意的解决方案,现在它给我们带来了麻烦,因为其中一个人不在,没有人知道他的仓库用户密码。所以,我正在尝试正确解决这个问题。
错误似乎发生在有人试图推送一个将改变由另一个用户拥有的仓库目录的更改时(因此在上面设置了组写入选项)。我在这方面做了一些谷歌搜索,并找到了几种正在讨论的解决方案(但对我都没有起作用)。
1. 确保仓库目录共享的组是每个用户的主要组(我相信这已经是这样了:每个用户只有一个组,所以那一定是他们的主要组,对吗?) 2. git仓库的core.sharedRepository设置,详见这里:Git: Can't push from one computer 我已经更改了这个设置,但没有任何改变。我需要重新加载配置或者做些其他操作才能生效吗?
这是我目前的仓库配置:
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
        sharedRepository = all
[receive]
        denyNonFastForwards = True

非常感谢任何建议或建议! Max

你能提供一个最小化的测试仓库来重现这个问题吗?如果仓库中有一个名为.GIT(大写)的目录,我总是可以得到它。 - Ciro Santilli OurBigBook.com
这也可能是由于磁盘已满,而不一定是权限问题! - GH05T
这对我来说很有效: https://dev59.com/IVkS5IYBdhLWcg3w253q#69334361 - akbar
16个回答

1

就我个人而言,我在自己的VPS上遇到了同样的问题,原因是VPS上的硬盘空间不足。通过df -h命令确认后,清理了VPS的硬盘空间后,问题得到解决。

干杯。


0

我以前也遇到过类似的问题:

 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'https://mywebsite.com/my-git-directory.git'

在我的情况下,我使用了 ls -l 命令检查了错误的目录所有权。我将目录所有者更改为 www-data 以解决问题,方法如下:
sudo chown -R www-data:www-data my-git-directory.git/

但在这种情况下,我不使用SSH方法,而是使用HTTP方法。

也许当我们确保目录所有者正确时,它可以解决问题。


0
重新打包错误可能会在压缩大文件时内存不足时发生。
请尝试执行以下命令限制打包内存和线程,然后再试一次?
git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"
git config --global pack.threads "1"
git fsck

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. 在存储库的pre-receive hook中添加此行以确保新文件权限允许组读/写:

    umask 007
    

0

对我来说,这是一个权限问题:

在 Git 服务器上,在仓库目录中运行此命令

sudo chmod -R 777 theDirectory/

永远不要使用777。相反,使用adduser [用户名]命令创建一个用户,然后使用chown -R [用户]:[组] [目录]将此用户设置为目录的所有者,最后使用chmod -R 775或类似的命令设置目录以便所有者可以写入。第一个数字控制用户权限,第二个数字控制组权限,第三个数字控制其他人的权限。 - kloddant

0
一个 Git 配置错误也可能导致这个错误。我给我的学生们举了一个配置的例子,就像这样:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

我的一个学生遇到了解压缩器错误。其他学生没有问题,但我仍然对git服务器的权限进行了双重检查,并确保学生在正确的组中。
最后,我让学生执行了git log,并发现他的配置是John Doe,但分支是他自己的名字。
正确设置他的配置消除了错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接