`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 模式;

    服务器搭建 git 仓库自用的教程

  • 问题 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 的建议:

    1. 检查磁盘空间

      确保远程服务器上的磁盘有足够的空间。可以通过执行以下命令查看磁盘使用情况:

      df -h
      

      如果磁盘空间不足,释放一些空间或将 Git 仓库移动到具有足够空间的分区。

    2. 检查权限

      确保 Git 仓库的临时对象目录及其父目录具有正确的权限。

      可以使用以下命令检查并修复,提高权限:

      chmod -R 755 /data/git/DStudy.git
      

      上述语句将 git 目录的权限修改为 rwxrw-rw-,即用户自身拥有完全的读写执行权限,用户组和其他用户拥有读写权限;

      不建议使用,只需要保证目录及其子内容的用户和用户组都是 git 即可,即:

      sudo chown -R git:git /data/git/DStudy.git
      
    3. 清理临时对象

      尝试清理远程仓库中的临时对象。执行以下命令:

      git gc --prune=now --aggressive
      
      • git gc --prune=now --aggressive:

        会触发 Git 进行更彻底的垃圾收集

        • git gc: Git 中的垃圾收集命令,用于清理和优化仓库的存储;
        • --prune=now: 表示立即删除不再需要的对象,而不是等到默认的垃圾收集策略触发;
        • --aggressive: 表示使用更激进的清理策略,包括合并和重建一些对象,以减小仓库的体积。

      谨慎使用。不要在本地仓库使用,可能会导致本地的未修改或 commit 的文件被清理掉。

    4. 重置远程仓库:

      在远程仓库上执行一些清理操作可能有助于解决问题。

      请注意,这将清除一些历史对象,因此请在执行之前确保您的仓库备份

      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 目录的所有者不同导致的,可以:

    1. 将该目录修改为执行命令的用户,如:

      sudo chown hw:hw -R /data/git/DStudy.git
      
    2. 继续执行 git reflog 命令;

    3. 再将目录所有者修改回来:

      sudo chown git:git -R /data/git/DStudy.git
      
posted @ 2024-01-15 11:44  华王135608  阅读(2790)  评论(0)    收藏  举报