`git push` 报错:error: remote unpack failed: unable to create temporary object directory (unpacker error)
-
祸首:wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理;
-
修改:NAT 改镜像
-
问题 1:在自己的服务器上新建 git 仓库时,推送就一直报错;最开始一直推送失败,怀疑是 WSL 的网关由 NAT 改为镜像了😂,不太确定,又改回 NAT 模式;
-
问题 2:再次推送,就变成了解包错误:
> git push -u origin main error: remote unpack failed: unable to create temporary object directory To ssh:/主机名称/data/git/DStudy.git ! [remote rejected] main -> main (unpacker error) error: failed to push some refs to 'ssh://主机名称/data/git/DStudy.git'
注:解决办法来自 ChatGPT
-
问题原因:这个错误表明 Git 在推送时无法解压缩远程仓库。这可能是由于临时对象目录权限问题或磁盘空间不足引起的。
-
GPT 的建议:
-
检查磁盘空间:
确保远程服务器上的磁盘有足够的空间。可以通过执行以下命令查看磁盘使用情况:
df -h
如果磁盘空间不足,释放一些空间或将 Git 仓库移动到具有足够空间的分区。
-
检查权限:
确保 Git 仓库的临时对象目录及其父目录具有正确的权限。
可以使用以下命令
检查并修复,提高权限:chmod -R 755 /data/git/DStudy.git
上述语句将 git 目录的权限修改为 rwxrw-rw-,即用户自身拥有完全的读写执行权限,用户组和其他用户拥有读写权限;
不建议使用,只需要保证目录及其子内容的用户和用户组都是 git 即可,即:
sudo chown -R git:git /data/git/DStudy.git
-
清理临时对象:
尝试清理远程仓库中的临时对象。执行以下命令:
git gc --prune=now --aggressive
-
git gc --prune=now --aggressive
:会触发 Git 进行更彻底的垃圾收集
git gc
: Git 中的垃圾收集命令,用于清理和优化仓库的存储;--prune=now
: 表示立即删除不再需要的对象,而不是等到默认的垃圾收集策略触发;--aggressive
: 表示使用更激进的清理策略,包括合并和重建一些对象,以减小仓库的体积。
谨慎使用。不要在本地仓库使用,可能会导致本地的未修改或
commit
的文件被清理掉。 -
-
重置远程仓库:
在远程仓库上执行一些清理操作可能有助于解决问题。
请注意,这将清除一些历史对象,因此请在执行之前确保您的仓库备份。
cd /data/git/DStudy.git git reflog expire --expire=now --all git gc --prune=now --aggressive
-
git reflog expire --expire=now --all
-
git reflog expire
: 用于更新引用日志(reflog)中的过期信息;引用日志记录着你在本地仓库中执行的一些操作,如分支切换、提交等。
expire
子命令则用于标记那些已过期的引用日志,以便 Git 在日后的垃圾收集(garbage collection)操作中删除它们。 -
--expire=now
: 参数表示立即过期,即标记所有引用日志为过期状态; -
--all
: 参数表示对所有分支的引用日志进行操作,而不仅仅是当前分支。
-
-
git gc --prune=now --aggressive
再次注意:一定要保证仓库数据有备份,谨慎使用!!谨慎使用!!!
-
-
-
其它问题:
fatal: detected dubious ownership in repository at '/data/git/DStudy.git' To add an exception for this directory, call: git config --global --add safe.directory /data/git/DStudy.git
这是因为执行
git reflog
命令的用户和/data/git/DStudy.git
目录的所有者不同导致的,可以:-
将该目录修改为执行命令的用户,如:
sudo chown hw:hw -R /data/git/DStudy.git
-
继续执行
git reflog
命令; -
再将目录所有者修改回来:
sudo chown git:git -R /data/git/DStudy.git
-