最近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やgit 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の状態に大きく左右されるので大変ですね。待つしかないのか....!