error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500、fatal: the remote end hung up unexpectedly

スポンサーリンク
Uncategorized

はじめに

容量が大きくて、pushできない事案が発生しました。

$ git push origin release_test
Enumerating objects: 76875, done.
Counting objects: 100% (76875/76875), done.
Delta compression using up to 8 threads
Compressing objects: 100% (59387/59387), done.
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500
send-pack: unexpected disconnect while reading sideband packet
Writing objects: 100% (76873/76873), 4.44 GiB | 18.50 MiB/s, done.
Total 76873 (delta 15788), reused 76254 (delta 15602), pack-reused 0
fatal: the remote end hung up unexpectedly
Everything up-to-date

errorとfatalがありますね。

error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500

fatal: the remote end hung up unexpectedly

です。

今回はこのエラーの対応について備忘の意味も含めて記載します。

対応

以下の「Gitリポジトリ内の不要になったオブジェクトを整理・圧縮し、1週間以上前に不要になったデータを完全削除する処理」を行ってみました。

$ sudo git gc --prune=1.weeks.ago

→再度add+commit+push実行

しかし、同じエラーでpushは失敗しました。

次に行ったのは、大きいファイルを削除してcommitする方法でした。

### 大きいファイルを見つける
$ find . -type f -size +50M | grep -v ".git"
./ollama/models/blobs/sha256-819c2adf5ce6df2b6bd2ae4ca90d2a69f060afeb438d0c171db57daa02e39c3d

### 確かにサイズが大きい...
$ ls -la ./ollama/models/blobs/sha256-819c2adf5ce6df2b6bd2ae4ca90d2a69f060afeb438d0c171db57daa02e39c3d
-rw-r--r-- 1 xxx xxx 669603712 Oct  3 06:52 ./ollama/models/blobs/sha256-819c2adf5ce6df2b6bd2ae4ca90d2a69f060afeb438d0c171db57daa02e39c3d
$ rm -rf ./ollama/models/blobs/sha256-819c2adf5ce6df2b6bd2ae4ca90d2a69f060afeb438d0c171db57daa02e39c3d

で再度add+commit+push実行

しかし、同じエラーでpushは失敗しました。

Gitリポジトリ内に存在する「巨大ファイル(blob)」をサイズ順に洗い出すコマンドを実行してみます。

$ git rev-list --objects --all | \
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
  grep '^blob' | \
  sort -k3 -n -r | \
  head -n 20

### 実行すると以下が出てくる。

blob d463b44279d058c337ae7b3cb540d97293defd66 1015364433 test/lib/python3.12/site-packages/torch/lib/libtorch_cuda.so
blob 52e9a2ca0ed9eac57bd0dc0b6db1df121efc0fb9 751771728 test/lib/python3.12/site-packages/nvidia/cublas/lib/libcublasLt.so.12
blob 527b51659f61af46aec4ea7f47082f7418f35078 669603712 ollama/models/blobs/sha256-819c2adf5ce6df2b6bd2ae4ca90d2a69f060afeb438d0c171db57daa02e39c3d
blob b6de7c7f170a9e69e81b59605be62c6e07995549 547383096 test/lib/python3.12/site-packages/nvidia/cudnn/lib/libcudnn_engines_precompiled.so.9
blob 7be0e6ce5a31ee8f1d9e53f8ea1c11f0240a7ca5 451980513 test/lib/python3.12/site-packages/nvidia/cusparselt/lib/libcusparseLt.so.0
・・・【略】・・・
blob 815f8185af121a553d1000fa1d2595e4e5b2efe6 104966520 test/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.alt.so.12
blob 610ec7f8172abe9a9af41ac45051d1660cd71053 104487248 test/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.so.12
blob 15ceab190829b35cea09f2d5994ca30495459994 94101392 test/lib/python3.12/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12

カレントディレクトリでpythonの仮想環境の設定をしてしまったばっかりに、python系のファイルが巨大ファイルとして今回のpush失敗の要因になってしまっています。

これからの作業をするうえで、怖いので念のためにバックアップを取っておきます。

$ tar czf ../go_slim_backup_before_cleanup.tar.gz .
$ cd ..
$ git clone --no-local go_slim go_slim_clean
$ cd go_slim_clean

バックアップが完了したら、作業に移ります。

Gitの全履歴から「指定した巨大な .so(共有ライブラリ)ファイルを完全に抹消する」コマンドを実行します。

すべてのコミット・すべてのブランチ・すべてのタグから存在しなかったことにします。

上記の「巨大ファイル(blob)」をサイズ順に洗い出すコマンドで出てきたblobを指定します。

$ git filter-repo --invert-paths \
  --path test/lib/python3.12/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12 \
  --path test/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.so.12 \
  --path test/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.alt.so.12 \
・・・【略】・・・
  --path test/lib/python3.12/site-packages/nvidia/cusparselt/lib/libcusparseLt.so.0 \
  --path test/lib/python3.12/site-packages/nvidia/cudnn/lib/libcudnn_engines_precompiled.so.9 \
  --path ollama/models/blobs/sha256-819c2adf5ce6df2b6bd2ae4ca90d2a69f060afeb438d0c171db57daa02e39c3d \
  --path test/lib/python3.12/site-packages/nvidia/cublas/lib/libcublasLt.so.12 \
  --path test/lib/python3.12/site-packages/torch/lib/libtorch_cuda.so

履歴を書き換えて削除したはずの巨大ファイルを、Git内部から完全に物理削除します。

以下のコマンドを実施します。

$ git reflog expire --expire=now --all
$ git gc --prune=now --aggressive

git reflog expire --expire=now --all についてですが、

reflogが過去にブランチがどこを指していたかを安全のために記録するものですが、

reflogがあるとgcができないので、–expire=nowでreflogを無効化しています。

git gc --prune=now --aggressive に関しては、

  • git gcはGit内部のゴミを集めるコマンドで、
  • –prune=nowで参照されていないオブジェクトは即削除します。
  • –aggressiveではpackfile を最大限圧縮します。

最後に、以下のコマンドでローカルの現在の状態(HEAD)をリモート(origin)のcleaned-repoブランチとして新規作成して、更新して送信します。

$ git remote add origin https://ghp_<token>@github.com/xxxxx/go_slim
$ git push origin HEAD:refs/heads/cleaned-repo

最後に

こんなことになる前にこまめにpushしましょうという戒めでした。

タイトルとURLをコピーしました