Git错误:远程解包失败:无法创建临时对象目录 - 通过创建新分支

44

我正在尝试在我的仓库中创建一个新的分支。

我做了这个:

git branch events
git Checkout events

那个起作用了。所以我改变了一些文件并做了:

git Status
git add --all
git commit -m "Commit"

那个方法起初效果不错,但我尝试过度使用它,结果失败了:


git push -u origin events

这是错误:

Enumerating objects: 9, done.                                                                                                                       
Counting objects: 100% (9/9), done.                                                                                                                 
Delta compression using up to 4 threads.                                                                                                            
Compressing objects: 100% (5/5), done.                                                                                                              
Writing objects: 100% (5/5), 716 bytes | 716.00 KiB/s, done.                                                                                        
Total 5 (delta 4), reused 0 (delta 0)                                                                                                               
error: remote unpack failed: unable to create temporary object directory                                                                            
To http://git.int.censoredlink/scm/freeb/freebrep.git                                                                                       
 ! [remote rejected] events -> events (unpacker error)                                                                                              
error: failed to push some refs to 'http://stsu@git.int.censoredlink/scm/freeb/freebrep.git'

我不知道为什么它不起作用。

我在仓库上拥有管理员权限。 我已经审查了链接到仓库的内容,因为这是一个带有私有链接的内部仓库。


如果有人遇到这个问题,我的解决方案就是在我的开发服务器上删除文件。结果发现我的开发服务器存储空间已满。 - Mederic
1
仅供参考,我之所以得到这个错误是因为我无意中使用了一个在服务器上有效但没有对该仓库具有写访问权限的用户帐户克隆了一个 repo。我通过编辑 .git/config 中的“remote-origin”条目来修复它。 - Martin CR
在服务器端检查.git目录的权限(或者从推送的用户处在服务器端执行git init)。 - Grigory Kislin
在本地克隆中的@m4l490n:在[remote“origin”]部分中,我只是将url = ...行中的用户名更改为具有写访问权限的用户名。 - Martin CR
@MartinCR 看起来对我没用。我使用的URL中没有用户。我的URL是:ssh://git.server.com:2222/path/to/repo/repo.git - m4l490n
显示剩余3条评论
10个回答

36
这个错误信息:

This error message:

error: remote unpack failed: unable to create temporary object directory
这意味着位于 服务器 上的 Git 仓库(不是你的 Git)空间不足,或遇到了类似的服务器问题1,或者安装不正确。也就是说,假设有以下情况:

To: http://git.int.censoredlink/scm/freeb/freebrep.git
您需要登录到提供 HTTP 流量的机器 git.int.censoredlink,进入 scm/freeb/freebrep.git 目录,并纠正安装问题。最有可能的是权限问题:接收 Git 必须能够在对象区域内创建一个名为 incoming-XXXXXX 的目录,其中的 X 由唯一的标识符替换,然后在该目录中创建一个 pack 子目录。
所有传入的对象和包文件都会被放置在这些目录中,以一种隔离程序的方式,直到服务器端的 Git 钩子满足引用名称更新请求。如果推送失败,则隔离目录将被简单地删除。如果推送成功,则已隔离的对象和/或包文件将被迁移(并调整薄包)到正常的对象存储区域。请注意,即使隔离过程成功,迁移也可能失败;但是,如果确实失败了,您将在客户端报告一个 不同 的错误。(此错误也必须在服务器上进行更正。)
注意:使用 http:// 而不是 https://ssh:// URL 推送通常是非常不寻常的。检查您的服务器配置,查看哪些用户将拥有所创建的各个文件,以及 Web 服务器将拥有哪些权限。
1 如果硬盘损坏,Linux 有时会将磁盘及/或其文件系统标记为只读。或者,即使您有磁盘空间,也可能用完了 inode。许多不同的根本原因都会导致客户端端出现相同的观察到的行为。如果您是 Linux 管理员,并正在检查服务器,请查找系统日志消息,并考虑使用 dfdf -i 输出。

4
虽然不完全正确,但我还是点赞了这个回答,因为它包含了快速调试所需的线索:在服务器管理员需要修复它的情况下,mkdir objects/incoming-XXXXXX显示“设备上没有剩余空间”,而我刚遇到了这种情况。如果你能重述或重组这个答案,那就太好了。(我同意您所有的观点,包括最后一段话,只是这并不是导致这种效果的唯一原因。) - mirabilos
2
@mirabilos 这是另一个可能的原因。错误的权限是更典型的问题。 - torek
2
当然可以...如果之前从未工作过,但如果这突然开始发生就不行了☻ - mirabilos
@mirabilos:这取决于您是否使用ssh://<user>@<server>进行推送,并设置了组权限。我经常在这里看到这种情况发生。 - torek

23

有90%的可能是权限问题。

  1. 登录到远程服务器。
  2. 导航到/scm/freeb,其中包含freebrep.git
  3. 运行chown -R yourusername freebrep.git(其中your user name为stsu)。
  4. 再次尝试。现在应该允许写入对象了。

还有可能是你的磁盘空间不足,就像我的情况一样,在第一时间查找可用空间... XD - Rodrigo
如果在第三个命令中遇到任何问题,请确保使用 sudo - Nicholas Mberev
对我来说,我犯了一个错误,执行了一个"git clone user@ip/path.git"的命令,其中"user@"是错误的,所以当我执行"git push"时,没有权限。 - undefined

6

如果你正在以root用户身份工作,请先切换用户为你的git用户,然后再初始化你的git目录

  1. 如果你是root用户 -> $ [root@server ~]#
  2. 切换用户 -> $ su - 用户名
  3. 初始化一个git仓库 -> [用户名@server ~] $ git init --bare git-repo.git
  4. 从客户端推送代码 -> 现在你可以从客户端推代码了:
    git remote add 你的别名 ssh://用户名@IP地址或主机名:ssh端口号/home/用户名/git-repo.git

注意:
我假设你已经在客户端创建了一个公钥/私钥并将公钥传递到服务器的/home/用户名/.ssh/authorized_keys文件中。否则,在第4步之前你需要完成这些操作。


未来读者:如果Git服务由不同的用户运行(与创建推送的用户不同),则该存储库很可能是由Git服务用户创建的。因此,在username@IP-or-HOST中的用户名必需的。这样可以避免在每个新创建的存储库上运行chown的需要。 - S3DEV

1

我因为这个错误信息而被重定向到这里。

错误:远程解包失败:无法创建临时对象目录

提示:当你将git目录挂载为只读时,也会出现这种情况。

例如:x.x.x.x:/nas/git on /mnt/git type nfs (ro,.....


1

最近我遇到了这个错误。问题是用户没有足够的权限,例如 git remote add production ssh://username@{your-ip}/var/test/test.git,请确保该用户名具有权限。


1
直到我在远程git仓库中删除了一个.git子目录,才解决了相同的错误。
.git子目录对于git登录账户来说是不可写的。最初,当我尝试提交时出现了权限问题,我怀疑是当时创建了.git子目录。

0

当我尝试向“已屏蔽的 git 服务器”推送代码时,遇到了相同的错误。问题出在服务器端。你可以等待一段时间直到服务器恢复正常运行,或者联系管理员修复它:)


1
抱歉,伙计,但这个答案没有提供任何有用的见解。 - ShadowGames
1
抱歉我无法提供一个恰当的解释。在公司工作时,我遇到过这个错误好几次,通常是服务器宕机时出现的。后来,当服务器恢复正常时,我就能执行推送命令了。不管怎样,感谢您的反馈 :) - Raj Salla

0
对我来说,它是一个挂起的、崩溃的 gitk 会话:在 Windows 机器上独占式阻塞文件访问。

-1

假设您在 Mac 上连接到 AWS 上的自己的 Ubuntu 服务器。

很可能您将作为用户"ubuntu"进行连接。

如果权限不是问题(只有您一个人),只需登录到您的 Ubuntu 服务器,然后

] chown ubuntu:ubuntu

所有有关的Git目录都可以。这样做没问题。


-1
问题:错误:远程解包失败:无法创建临时对象目录 到https://url.com/scm/som/project.git ![remote rejected] release/project-PROD-year_month_WeekNumber -> release/project-PROD-year_month_WeekNumber(解包器错误) 错误:无法将某些引用推送到'https://url.com/scm/som/project.git'

解决方案: 打开gitbash进入项目根目录。

chmod 777 *

然后再尝试git push

这对我有用


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