git克隆失败,由于服务器端缺乏内存



我正在尝试从位于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上内存不足.

我见过几个解决方案,基本上包括使用以下命令。但说实话,我真的不明白我是否应该把一个小窗口的记忆。尺寸限制,或者一个大的。无论如何,我尝试了20米和100米,没有任何工作:(

$ 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,但这对我不起作用,因为我的存储库不是克隆的。

最后,我不确定上面的命令是否能解决我的问题,我希望有其他的解决方案,这样我就可以克隆我的repo了:)如果有一种方法可以在服务器端精确地看到问题,请告诉我。

日志:

在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日)

  • 我正在寻找一个解决方案,我保持在RPi 3上的GOGS服务器。这意味着我不考虑升级到RPi 4的解决方案,或者为我的RPi添加RAM…
  • 我尝试了一个可能接近工作的git clone --depth 1 git@192.168.0.62:axelle/prog.git…但最后内存不足。
  • 输出:

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%。这样可以确保交换文件的大小是合理的。如果您的磁盘已满,您需要先腾出磁盘空间。
  4. 此解决方案仅适用于由于服务器端内存不足导致的Git服务器故障!

最新更新