GitHub から Clone できなくて焦った話

Raspberry pi 上で動かすスクリプトを、Mac である程度開発を進めて、コミットしておいて、これを Raspberry pi 側から Clone して動かそうと思ったら最初うまくいかなくて困ったって話。

ローカルなんで SFTP とか SCP とかであげちゃえばって話はあるんだけど、後々のこと考えるとここ GitHub 経由させたかったのです。

TL;DR

うまく config が反映されてないっぽい。
以下のいずれかの方法を使えばOK。(後者はなにかとトラブルになりそうなので普通は前者でOK)

  • .ssh/configHostgithub とか gh とかにしてたなら、github.comにしてみる
  • あるいはリポジトリをクローンするときのアドレスを gh:username/repo.git みたいにエイリアスにする

Mac だと起こらないんだよなぁ。Linux だから?謎です。

鍵を作って、コンフィグをかいた

ssh-keygen -t ed25519 -C "foo@example.com"

鍵名はデフォルトじゃなくて、ちゃんと GitHub 用に名前を付けた

コンフィグもかいた

Host github
        User git
        HostName github.com
        IdentityFile ~/.ssh/com.github.ed25519

この辺は Mac の ~/.ssh/config から鍵名以外全部コピーしたのであってるはず…だった。
(この思い込みで苦労することになりました)

疎通確認

こんな感じでちゃんと設定できてるか確認します。

ssh -T github
Hi nyagihime! You've successfully authenticated, but GitHub does not provide shell access.

こんな感じで、認証できたけど GitHub に SSH しちゃダメだよっていわれれば成功。
なので、これで設定は完了です。

リポジトリをクローン……できなかった

さて、GitHub 上にリポジトリをつくったので早速 Raspberry pi にクローンしてみます。

git clone git@github.com:nyagihime/some-project .
Cloning into '.'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

するとなぜかクローンできませんでした。
自分がオーナーだし、疎通確認もできたはずなのに。

原因を探す

あらためて GitHub のヘルプ とかをみつつ順番に確認していきます。

SSH 接続をテストする - GitHub Docs

前回は手打ちでいれたので、今度はテスト用のコードをコピペでいってみました。

ssh -T git@github.com
git@github.com: Permission denied (publickey).

するとどういうことでしょう。認証が通りません。
ということで、詳細ログを出して再度テストします。詳細ログを出すには -v をつけます。

-v は verbose の頭文字で、「冗長な」とか「くどい」といった意味があります。

すると、今までは隠れていたログが見えるようになります。
いろいろありますが、この手の問題の場合大抵は鍵周りなので、まずは identity file という行を探します。

debug1: identity file /home/pi/.ssh/id_rsa type -1
debug1: identity file /home/pi/.ssh/id_rsa-cert type -1
debug1: identity file /home/pi/.ssh/id_dsa type -1
debug1: identity file /home/pi/.ssh/id_dsa-cert type -1
debug1: identity file /home/pi/.ssh/id_ecdsa type -1
debug1: identity file /home/pi/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/pi/.ssh/id_ecdsa_sk type -1
debug1: identity file /home/pi/.ssh/id_ecdsa_sk-cert type -1
debug1: identity file /home/pi/.ssh/id_ed25519 type -1
debug1: identity file /home/pi/.ssh/id_ed25519-cert type -1
debug1: identity file /home/pi/.ssh/id_ed25519_sk type -1
debug1: identity file /home/pi/.ssh/id_ed25519_sk-cert type -1
debug1: identity file /home/pi/.ssh/id_xmss type -1
debug1: identity file /home/pi/.ssh/id_xmss-cert type -1

あれ、なぜかデフォルトの id_rsa を探してます。

コンフィグの書き方がダメだった

先ほど書いたコンフィグですが、Host が github だとダメみたいで、ここもちゃんと github.com にすれば設定が反映されるようになりました。

-Host github
+Host github.com
        User git
        HostName github.com
        IdentityFile ~/.ssh/com.github.ed25519

再テスト

ssh -T git@github.com
Hi nyagihime! You've successfully authenticated, but GitHub does not provide shell access.

まとめ

GitHub で使う鍵を config から指定するときは Host に github.com とドメインまで含めて書けばよいみたいです。(今までこれで動いてたんだけどなぁ……)
通常、Host のところは短い別名にしておいて SSH コマンドをシンプルにして運用したりするんですが、GitHub にはシェルアクセスはできない(なんどもログに流れてた GitHub does not provide shell access です)のでため、git コマンドの補助用みたいな感じで割り切ってしまうのがよいと思います。

そこまで割り切る場合、鍵の付け合わせ専用にしちゃって、User とか HostName すら落としても動くかも…。

どうしても短い別名を使いたい

どうしても、Host にドメインをつけたくない場合は、逆にリポジトリのアドレスを修正すれば一応動きます。

つまり、

-git clone git@github.com:nyagihime/some-repository.git
# Host = github
+git clone github:nyagihime/some-repository.git
# Host = gh
+git clone gh:nyagihime/some-repository.git

という感じで、git@github.comconfig で設定した Host の値にすればちゃんと動きます。

ただ、一般的な運用方法とは違うし、GitHub からコピーできるリポジトリリンクとかは git@github.com を使う設定になってるので、おとなしくエイリアスを使わない運用にしておく方が良いのかなぁ、とは思います。

git log --format=%ct:%s

:rename source path