最近 GitHub への DDoS が頻発しており、それに伴い Pull や Clone を含めて git remote show origin など remote 状態の取得ができないことが起こっています。
で、特に以下にある 3/22 における影響では、アジアパシフィックからのパケットロストが報告されていました。
- 1:04 UTCAs a result of our ongoing DDoS mitigation, we're experiencing high rates of packet loss from users in the Asia-Pacific region. We're working on reducing this disruption to service and will provide additional information when it becomes available
今回は、経過とどう対応したかを。
目次
経過
私の手元では、3分置きに定期的に git pull をする必要がある環境があります。
GitHub が DDoS を受けると、顕著に影響がでるのでその時間経過を見てみましょう。
時刻(JST) | 状態 | Error/GitHub表示 |
---|---|---|
2014/3/22 4:49 | エラー発生開始 | exit code 1 for pulling "RepositoryName".error: Connection time-out while accessing https://github.com/"Account"/"RepositoryName".git/info/refs?service=git-upload-pack fatal: HTTP request failed |
2014/3/22 07:22 | 一時的にエラーなくpull | 2014/03/22 7:44:12 : Pulling Repository 'Repository Name'Already up-to-date. |
2014/3/22 10:04 | GitHub Status | GitHub Status で パケットロストしてるユーザーがいるよ。と表示 |
2014/3/22 11:20 | エラー継続 | https では エラーがでるものの、ssh ではエラー出ずに完了 |
2014/3/22 12:30 | エラー解消 | https でもエラー出ずに完了 |
2014/3/22 12:35 | GitHub Status | 解消GitHub Status で治ったよ。と表示 |
対処
今回のでは、https を使っていたのですが、GitHub Status 更新前の 8:00 で次の状態でした。
- https での git コマンドが一切合財 どの Repository でもはじかれてる
- Connection time-out - Authentication failed - git remote で結果返さず停止 - error: RPC failed; result=22, HTTP code = 411 - 他
- https での、 error: RPC failed; result=22, HTTP code = 411" の対処として buffer を 512MB にしてもだめ
git config http.postBuffer 524288000 あるいは、.gitconfig に追記 [http] postBuffer = 524288000
- https から git(ssh) に切り変えると git clone も pull も いくつかでは できるようになる
- 容量の大きい Repository では 引き続き timeout が発生する
で、11:20に ssh を使って GitHub Status の連絡前に 改善を確認。ただし https では Connection time-out が引き続き発生している)
https と ssh の注意
状況に応じて選べばいいと思います。
ssh と https では 圧倒的に https が早い
同じリポジトリ に対しても、 git(ssh) と https では速度が違います。
処理 | 転送速度 |
---|---|
ssh | 200 KiB/s |
https | 7.87 MiB/s |
https では GitCredential が飛ぶ場合がある
https の場合は、 user / pass を使うのですが、Windows では 認証マネージャー の git:https://github.com を使います。
Windows の 認証マネージャーですが、GitHub との 通信が Connection time-out などを起こした時に、クレデンシャル自体が消える場合があります。
この場合、以前紹介したPowerShell で Windows の 資格情報マネージャー を利用する (Jenkins などでの Git Credentialなど) など、自動化しておくといいでしょう。
PowerShell からの Git コマンドで ssh は注意
まぁ普通なんですが、 必ず ssh-agent からの ssh-add
Source Tree とかで ターミナル開いてやると、Source Tree で設定した ssh キーが自動的にセットされるので意識されないんですが、 PowerShell で自動化するときはやってね!っていう。
これは Linux でも一緒なのでいわずと知れてますよね。
まとめ
https だとエラーがでても ssh では うまく行く場合が多くあります。
容量が小さい Repository では ssh が認証を意識することがない上、障害時にうまくいくことが多いように思います。
が、容量が大きい場合、 ssh ではそもそも完了まで相当かかったりするため、 https しか選択肢が実質ないことも。この場合、GitHub Status の状態に大きく左右されるので大変ですね。待つしかないのか....!