
コマンドライン苦手系IT人間なので、GitHubはSourceTreeで使っています。
ところが、いつ頃からかわからないのですが、たまにSourceTreeでGitHub(とかGitLabとか)にプル/プッシュしようとすると「Permission denied (publickey)」と言われるようになりました。公開鍵を設定し直すと出なくなるのですが、どうもめんどくさいし気持ちが悪いので対処方法を調べてみました。
原因
調べたら、Macを再起動すると ssh agent に登録された鍵がまっさらになってしまうことが原因のようでした。なるほどエラーが出たり出なかったりするのはそういうことか……
対処方法
以下のようにssh-addコマンドでGitHub用の秘密鍵を登録してあげればSourceTreeのエラーが出なくなります。
$ ssh-add ~/.ssh/(GitHub用の秘密鍵)
GitLabも同じ。どうでもいいですが、GitLabはアカウントを追加するときにアカウントのパスワードじゃなくてアクセストークンを使う、ということを毎回忘れて「なんでアクセスできないんじゃぁ……」ってなる。
再起動しても消えないようにする
ssh-addで登録しても再起動すると設定は消えてしまうので、再起動するたびにssh-addする必要があります。秘密鍵をキーチェインに登録して、キーチェインから自動的に読み込まれるように設定すればおk。
まず、ssh-addコマンドで秘密鍵をキーチェインに登録します。-K オプションを入れるとキーチェインに追加されます。
$ ssh-add -K ~/.ssh/(GitHub用の秘密鍵)
続いて .ssh/config に以下の内容を追加します。
Host *
UseKeychain yes
AddKeysToAgent yes
これで再起動しても自動的に鍵が登録されるようになるハズ。
configの書き換え
Sourcetree で鍵を設定すると ~/.ssh/config
に以下のように設定が書き込まれます。(USER
は自分のユーザ名です。)
# --- Sourcetree Generated ---
Host USER-GitHub
HostName github.com
User USER
PreferredAuthentications publickey
IdentityFile /Users/USER/.ssh/USER-GitHub
# ----------------------------
このうち Host と HostName を書き換えて以下のようにします。
# --- Sourcetree Generated ---
Host github.com
HostName github.com
User USER
PreferredAuthentications publickey
IdentityFile /Users/USER/.ssh/USER-GitHub
# ----------------------------
Gitlabの場合も同様に Host と HostName を書き換えます。
# --- Sourcetree Generated ---
Host gitlab.com
HostName gitlab.com
User USER
PreferredAuthentications publickey
IdentityFile /Users/USER/.ssh/USER-GitLab
# ----------------------------