Git の PUSH が異様に遅かった

普通に git で開発していて、GitHub に PUSH しようと思ったらなかなか終わらず。
ターミナル見てみると……

$ git push origin feature/253
Enumerating objects: 4442, done.
Counting objects: 100% (4442/4442), done.
Delta compression using up to 10 threads
Compressing objects: 100% (3158/3158), done.
^Citing objects:  35% (1574/4442), 177.81 MiB | 224.00 KiB/s

224KiB/s って……遅すぎぃ。。
いつの時代の通信回線だよ……

一応、スピードテストとかやってみたり、GitHub の障害とかもチェックしましたがいずれも問題なしでした。

対処方法

ターミナル閉じて開き直したら治りました。
なんでだよ。。

しかもこれ、ターミナルだけの問題だったらまぁターミナルの調子が悪かったのかな?って感じで済むんですけど、Sublime Merge のような GUI ツールでも重かったんですよね。
もちろんこれも裏で Git コマンド発行してるとかなのかもしれませんが、使ってるターミナルとは直接関係ないだろうし、なんだったんだろう…。

今日のまとめ。

困ったらとりあえず再起動してみよう。

別解

……だけってのもアレなので。
実は PUSH が遅くなる原因は他にもあるみたいで、 今回はなんかネットワーク関連が原因っぽかったですが、これとは別に、大容量のファイルをコミットしてたりすると、PUSH 時のバッファーサイズの関係で遅くなる場合があるみたいです。

なので、その設定を大きくしてあげることで解消できる場合もあります。

設定するには、ターミナルから以下のコマンドを入力します。

$ git config --global http.postBuffer 104857600

またはコンフィグファイルに書く場合は

[http]
  postBuffer = 104857600

みたいな感じ。

これで、PUSH時のバッファが 100MiB1になります。
デフォルトではこのバッファのサイズが 1MB しかありませんので、バッファサイズを超えた時に出るという 411 エラーなんかの対策としても有効だと思います。

じゃあなんでこんなにバッファが小さいのかというと……たぶんですけど、これってもともとソースコード管理のツールですし、ソースコード(テキストファイル)が 1MiB 超えるとなると、約100万文字2、80文字で改行してみっちり書いても 12500行 ですので、普通は問題になることはないってことなんだと思います。
ですが、高解像度の画像などをコミットしたい場合なんかには有効だと思います。

尚、今回はグローバル設定に書きましたが、PUSH 中ここで設定した値文だけメモリを消費することになるのでかなり大きめに設定する場合はリポジトリのローカル設定に書いて、そのリポジトリでのみバッファを大きくする様にするなどの工夫が合っても良いと思います。

まぁ、昨今の PC では数100MB位気にならないかもしれませんが。。

Footnotes

  1. 100 * 1024 * 1024 = 104857600 byte
  2. すべて半角英数(1バイト文字)だと仮定しての計算です。仮に原稿データのような2バイト文字主体だとしても、その半分の50万文字。400字詰原稿用紙で1250枚分です。

git log --format=%ct:%s

:update post
:add 2023082201.md