事象
社内のオンプレミスの gitlab に対して、 tortoise git では ssh できるのに、 git bash では ssh できない!1
原因
普段 ssh で使用している秘密鍵は、 putty で作成した鍵でした。 tortoise git 使っているときには、putty 形式の鍵が使えたのですが、 git bash では対応していないみたいです。
その代わり、 git bash 上で ssh-keygen
コマンドで生成したものを使うとうまくいくみたいです。
対策方法
考えうる方法としては以下があります。
- putty の秘密鍵を、open-ssh 形式に変更する。([bash]puttyで作成した公開鍵をopenssh(GitHubなど)キーへ変換する方法 | Coffee Breakにプログラミング備忘録)
- tortoise git 用と gitbash 用で鍵を使い分ける(つまり、gitlab に2通りの鍵を登録する)
本来は 1. のほうがスマートなのですが、上記リンクにあるやり方を実行しても、 uudecode failed.
って言われて拒否されたので、今回は 2. のやり方を採用します。
本題
ということで、本題の git bash で gitlab に ssh する方法についてです。以下、備忘録として手順を載せておきます。
鍵を生成する
いろいろ調べてみたんですが、なかなかすんなりうまくいきませんでした。結局何が正解かというと、やっぱり本家なんですよね。
ということで、英語だったので敬遠してたのですが、 gitlab 公式を参考にします。
ssh-keygen -t rsa -C "your.email@example.com" -b 4096
すると、出力ファイル名を聞かれるので、適当に入力します。
Generating public/private rsa key pair.
Enter file in which to save the key (XXX/.ssh/id_rsa):
デフォルトで id_rsa
っぽいので、ここはそのまま enter しました。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
言われるまま任意のパスワードを入力します。
これで、鍵が生成されました。
gitlab に公開鍵を登録する
生成されたファイルの一つである id_rsa.pub
をメモ帳とかで開き、中身を全てコピーします。
で、[gitlab の画面の右上にある自分のアイコン] -> [Settings] -> [SSH Keys] で、「Key」欄にコピーした内容を貼り付けます。(「Title」欄はコピペしたときに勝手に補完されるみたい)で、「Add key」で登録できます。
config ファイルへの登録
ここが一番のミソです。というか、ここが一番ハマりました。(ググってもあまり情報が出てこなかった・・・)
どうやら git bash では、~/.ssh
の config ファイルを使用せず、独自の config を使用するみたいです。
ということで、C:\Program Files\Git\etc\ssh
フォルダ内にある ssh_config
ファイルを開きます。
試行錯誤の上、私の環境では以下のような設定を追加しました。
Host gitlab
User git
HostName 172.XX.YY.ZZ ←IPアドレス
IdentityFile ~/.ssh/id_rsa
Port XXXXX ←ポート
IdentitiesOnly yes
そして、以下の通り接続できることを確認します。
$ ssh -T gitlab
Enter passphrase for key '/c/XXXX/.ssh/id_rsa':
Welcome to GitLab, 〇〇〇!
これでとりあえず git bash から gitlab へアクセスできることが確認できました。
まとめ
上記手順で設定すると、 git subtree
で gitlab にアクセスすることができるようになりました。
(しかし、何故かいちいちパスフレーズを聞いてくるのがちょっと面倒です・・・)
まあでも動くようになったので、良しとしましょう・・・
- 普段、社内ではリモートリポジトリとして、オンプレミスの gitlab を使用しています。そしてクライアント側(というか私の作業環境)では、 tortoise git を使用して gitlab にアクセスしています。現在のプロジェクトでは
git subtree
を使用しているのですが、残念なことに tortoise git は subtree に対応していません。仕方がないので、 subtree 使う時だけ git bash を使用しているのですが、そのときに現象に気づきました。↩
コメント