Gitでリモートレポジトリとやり取りする際のプロトコルにはhttp(s), git, sshの3(4)種類があって、特にGitHubとのやり取りにおいては各プロトコルによって出来ること/出来ないことの差がある。
http(s)
- GitHubの推奨はhttps。
- httpに関しては記載がないが、一応使える(が、あえて使う意味もないと思う)。
- 認証はGitHubのユーザー名、パスワードによる。
- GitHubで2段階認証を設定している場合は、 パスワードの代わりにアクセストークンが必要になる。
git
- 高速らしい。
- GitHubでは昔は言及があったと思うが、現状は言及がない。が、使える。
- 認証機構を持たないため、gitプロトコルで
git clone
した場合はread-onlyになる。
ssh
- セキュア。GitHubの場合は鍵認証を行いたいときに使う。
- というかだいたいのユーザーは鍵認証していると思うので、
git push
するときはこれ。
非常に大雑把ではあるが以上のような機能上の制約があり、時にリモートレポジトリのプロコトル指定の差異によってトラブルに見舞われる。
トラブル例
git push
できない
上述の通りgitプロトコルはread-onlyとなるため、gitプロトコルとなってしまっている可能性が高い。
公開鍵を登録しているのにgit push
するとUsername for
が出てくる
http(s)では鍵認証を行えないため、http(s)プロトコルとなってしまっている可能性が高い。
2段階認証設定してからgit push
できなくなった
http(s)プロトコルを使用していて、パスワードを訊かれた際にアクセストークンを入力していない。もしくは鍵認証でsshを使うことにより回避可能。
結論
sshを使っておくのが開発上は無難。とりあえずgit push
でトラブったらリモートレポジトリの設定を確認して、URLを適切なプロトコルで書き換えておけばいい。git clone
したときのプロトコルがそのまま使われるようなので、httpsでクローンしてそのままになっていることはわりと多い。
確認
$ git remote -v
origin https://github.com/chroju/example (fetch)
origin https://github.com/chroju/example (push)
設定
$ git remote set-url origin git@github.com:chroju/example.git
ちなみにこれらを調べるきっかけになったのは、GitHubの2段階認証を設定したらgit push
できなくなったことだった。それまでしばらくgit push
したらユーザー名を訊かれるので変だとは思っていたのだが、ちゃんと直してなかった。
Octopressの場合(2015-12-15 追記)
Octopressではrakeコマンドでリモートレポジトリの設定を行っており、 git remote set-url
で上書きをしても有効にならない。
$ rake setup_github_pages
Repository url: git@github.com:chroju/chroju.github.io
これによりリモートレポジトリとの整合性に不具合が生じ、 rake deploy
がrejectedされることがあるが、直接Rakefileを書き換えて git push origin +#{deploy_branch}
としてforced updateしてしまえばよい(危険な操作なので一応注意の上で)。
参考:Octopressでrake deployした際にrejectedされた場合の対処 - Qiita
余談 - hubを使うと全部解決する
なお、GitHub謹製のhubを使えばこんなことには悩まなくなる。hub
はGitHub用に最適化されたgit
コマンドのエイリアスであり、完全に置き換えて使うことを意図されている。以下、READMEより抜粋。
$ git clone schacon/ticgit
> git clone git://github.com/schacon/ticgit.git
$ git clone -p schacon/ticgit
> git clone git@github.com:schacon/ticgit.git
$ git clone resque
> git clone git@github.com/YOUR_USER/resque.git
他にもhub browse
でカレントレポジトリのGitHubページをブラウザで開いてくれたり、コマンドでプルリクできるようになったりだいぶ便利。