sshコマンドで接続は可能
「.ssh/config」にgithubへの接続設定を記載し、githubに公開鍵を登録しました。
Host github
HostName github.com
identityFile ~/.ssh/<Keyファイル名>
IdentitiesOnly yes
TCPKeepAlive yes
AddKeysToAgent yes
User git
テストコマンドで接続も確認。
ssh -T github
Hi <ユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.
実は、「.ssh/config」にあるミスがあります。
ssh単体のテスト接続は確認できるので、ここで問題には気づけませんでした。
もう、気付いた人もいると思います。実は、最初に「.ssh/config」を作成したとき、このミスをしていませんでした。いろいろと調査しているときに変更して、その修正を忘れていました。
gitへのpushができない
上記の状態で、gitへpushします。
すると、許可されていないというエラーメッセージが表示されて、pushできません。
git push origin staging:staging
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
いつもならpushできるのにおかしいなと思いました。
今回はorganizationのリポジトリへpushしようとしてたので、権限かなあと思ってそのあたりも見直しました。でも、それも問題なさそうでした。
とにかく、gitのリモートリポジトリを確認しようと思いました。
git remote -v
origin git@github.com:<組織名>/<リポジトリ名>.git (fetch)
origin git@github.com:<組織名>/<リポジトリ名>.git (push)
想定どおりのリモート先。
ただ、これをみてるときに、sshのホスト指定とgitのホスト指定をリンクさせるのはドメイン名だから、そこに違いがあるんだろうなと思いました。
.ssh/configのHost名と.git/configのリモートドメインの不一致
冒頭の「.ssh/config」の設定で気付いた人がいると思います。問題の原因は、Host名に「.com」が抜けていることでした。「.ssh/config」のHost名とリモート先のドメイン名が一致していなかったので、gitのコマンドがssh接続の設定情報を取得できず、エラーになっていました。
Host github ← ここに「.com」がない
...
上記を以下のように修正しました。
Host github.com ← 「.com」を追加
...
再度、gitでpushコマンドを実行します。
git push origin staging:staging
Everything up-to-date
今度はエラーなくpushができました。
問題調査の為の変更が問題を引き起こす
今回、新しい構成でやってみていて、いろいろと問題が起こりました。設定を変更しながら原因追及していました。その際に、「.ssh/config」のHost名を変更しました。「.ssh/config」のHost名は単なる設定名称なのでドメイン名でなくても接続情報を取得できるのを確認していました。確かに、sshの接続だけなら想定通り接続できました。
この変更を修正せずに、別の仕事をし、変更したことをすっかり忘れていました。
そして、いざgit pushすると接続できず、かなりハマりました。
こうした個人のうっかりミスに関するエラーはなかなかネットにないことがあります。これは、自力でなんとかしないといけません。まさに、探偵になったつもりで原因調査しました。
気づいたら大したことない原因で、自分がまいた問題なんですが、解決するとめっちゃうれしかったりします。
個人的な低レベルなミステリーでした。
もし、同じような原因の人の助けになれば幸いです。