git 由于服务器端内存不足,克隆失败

git clone fails due to lack of memory on server side

我正在尝试从位于 Raspberry Pi 3 上的 GOGS 服务器克隆 git 存储库。失败并出现以下投诉:

git clone git@192.168.0.62:axelle/prog.git
Cloning into 'prog'...
remote: Enumerating objects: 3008, done.
remote: Counting objects: 100% (3008/3008), done.
error: pack-objects died of signal 9541/2583)   
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

因为我使用另一台主机的存储库没有任何问题,我认为没有任何损坏。相反,当我在服务器上登录 时,我看到 RAM 急剧下降, 然后 Pi 基本上冻结了,在客户端出现错误后不久,我的 Pi 服务器恢复了它的记忆。所以,我认为 我的克隆失败是因为我在 Rpi.

上的内存不足

我见过几种解决方案,基本上都是使用如下命令。但老实说,我真的不明白我应该放一个小的 window 内存和大小限制,还是一个大的。无论如何,我尝试了 20m 和 100m,但没有任何效果:(

$ git config --global pack.windowMemory "100m"
$ git config --global pack.SizeLimit "100m" 
$ git config --global pack.threads "1"
$ git config --global pack.window "0"
$ git config --global core.bigfilethreshold 200K

关于大文件 - 这可能是克隆失败的另一个原因,我可能有一些大文件,但不是太多。 如何检查我的存储库中最大的文件是什么?然后我应该将 core.bigfilethreshold 设置得稍微高一点吗?

此外,我看到有人推荐 git fsck,但这对我不起作用,因为我的存储库未被克隆。

最后,我不确定上面的命令是否能解决我的问题,如果有任何其他解决方案以便我可以克隆我的存储库,我将不胜感激 :) 如果有办法在服务器端准确地查看问题,让我也知道

日志:

在 RPi(服务器)端,我有以下日志。我不认为它们是相关的,特别是第二个是关于另一个存储库(文档),而我正在尝试克隆(prog):

home/git/gogs/log $ sudo cat serv.log
2021/08/27 11:13:05 [FATAL] [...ogs/gogs/cmd/serv.go:268 runServ()] Fail to execute git command: exit status 128

/home/git/gogs/log $ sudo cat gogs.log
2021/08/27 00:16:18 [ WARN] Failed to perform health check on repository '/home/git/gogs-repositories/axelle/docs.git': execution is timeout [duration: 1m0s]

已编辑(2021 年 9 月 2 日)

输出:

git clone --depth 1 --branch master git@192.168.0.62:axelle/prog.git
Cloning into 'prog'...
remote: Enumerating objects: 1355, done.
remote: Counting objects: 100% (1355/1355), done.
error: --shallow-file died of signal 98/1125)   
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

Raspberry Pi 上,RAM 有限,无法轻松添加更多。在您需要更多 RAM 的情况下(这是 GOGS 故障的情况),解决方案是使用或增加交换文件的大小

在我的例子中,交换文件已经配置为 100M,但是不够。增加它(例如1G):

  1. 暂时禁用交换文件:sudo dphys-swapfile swapoff
  2. 编辑文件 /etc/dphys-swapfile 并修改 CONF_SWAPSIZE。示例:CONF_SWAPSIZE=1024
  3. 安装此大小的系统:sudo dphys-swapfile setup
  4. 重新启用交换文件:sudo dphys-swapfile swapon

这解决了我遇到的问题,Git 服务器在 RPi 上失败,因为它缺少 RAM。

$ git clone git@192.168.0.62:axelle/prog.git
Cloning into 'prog'...
remote: Enumerating objects: 3019, done.
remote: Counting objects: 100% (3019/3019), done.
remote: Compressing objects: 100% (2594/2594), done.
Receiving objects: 100% (3019/3019), 638.82 MiB | 2.30 MiB/s, done.
remote: Total 3019 (delta 1217), reused 1353 (delta 234)
Resolving deltas: 100% (1217/1217), done.
Updating files: 100% (1158/1158), done.

注意:

  1. 使用交换文件会比 RAM 慢
  2. 根据您的情况,您需要调整交换文件的大小。
  3. dphys-swapfile setup 检查您没有要求超过 50% 的可用磁盘 space。这确保您的交换文件大小合理。如果您的磁盘快满了,您需要先制作磁盘 space。
  4. 此解决方案仅适用于Git服务器端内存不足导致的服务器故障!