GitHubのremote URLにはどのプロトコルを使えばよいのか?

  • 15
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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ページをブラウザで開いてくれたり、コマンドでプルリクできるようになったりだいぶ便利。

参考