突然Git Pushができなくなった時の一つの解

それはある日突然訪れた。

取引先と共有しているBitBucket上のリモートリポジトリに、ローカルでコミットしたソースコードがPushできなくなった。ソースコードはSails.jsサーバ上で組んでいるもので、クライアントはReactを使用してビルドしたものだ。

Sails.js | Realtime MVC Framework for Node.js

React – ユーザインターフェース構築のための JavaScript ライブラリ

これまで問題なく使えていたのだが、ある日突然次のようなログに見舞われPushできなくなった。

Enumerating objects: 47, done.
Counting objects: 100% (47/47), done.
Delta compression using up to 12 threads
Compressing objects: 100% (29/29), done.
fatal: the remote end hung up unexpectedly
Connection to bitbucket.org closed by remote host.
fatal: the remote end hung up unexpectedly

少量の変更なら問題なく使えたので、どう切り分ければいいのか皆目見当が付かない。

主眼を「大量データのPush」に絞り、 git push fatal hung up のようなキーワードでググり、.git/config上で ssh.postBuffer をいじってみたり、~/.ssh/config上に ServerAliveInterval を設定してみたりと手を尽くしたものの、一切変化がなかった。

もしやBitBucket特有のものかと思っていたら、別の取引先でGitHub上に共有していたソースコードも同様のログとともにPushできない事象に見舞われた。OMG

実は問題なく使えていた時と、問題が発生した時の環境で唯一違いがあった。それは「引越し」をしたことだ。プロバイダや回線は全く一緒なのだが、引っ越したことでネットワーク環境に何らかの差異が発生したのではと思った。

そこで自宅のLAN環境を無効にして、モバイルWi-Fiルーターで試してみた。が、問題は解決しなかった。なんやねん!

目の前が真っ暗になりかけたその時、検索画面に次の記事の検索結果が引っかかった。

GitLabとSSH接続 - Qiita

根本的な解決方法ではなさそうなものの、見出しが気になりリンクをたどると、内容は「ssh接続をhttpsポート(443)でつなぐ」というものだった。なるほど、22番以外でも接続することはできるのかと思い、失敗していたGitHub.comへの接続設定に適用してみた。

「こいつ・・・動くぞ!」

なんとこれまでウンともスンともPushできなかったコミットが、さらっと completed のメッセージとともにPushを完了した。そこで問題のBitbucketの方もやってみたところ、こちらも問題解決!見事に突破した。

22番ポートの何がダメになってしまったのか、そもそもの話はまるでわからないままだが、443番ポートを介することで、できなかったことができたことに違いはない。

参考にしたサイトに謝意を述べるとともに、リンクを掲載しておく。もし postBufferServerAliveInterval などで一切解決できなかった方はお試しあれ。

BitbucketにHTTPSポートでSSH接続する方法 – Memoteki

22 番ポートが通らない環境で GitHub / BitBucket / GitLab を SSH 経由で利用する方法 - Qiita