インターネットに接続可能な環境で PC 作業をするときは、作業時間の最後に 10 個近くのリポジトリーを自作シェルスクリプトで一括 push/pull している。 コマンドをバックグラウンド実行するのだが、本日、何かの理由で GitHub 側からユーザーとパスワードを問うダイアログボックスが表示されるようになった。 これを放置しておくとパスワードプロンプトが 10 個出てきてバカらしい。 本稿はこれの対策ノートだ。

原因:半分はわからない

半分は HTTPS プロトコルでリモートリポジトリーへ接続していることだという。 これを SSH 接続に改めれば、少なくとも確認ダイアログは出てこないという。 それを信じて以下の作業を実施する。

解決策:HTTPS での通信を SSH に全部変える

そもそも Cygwin に ssh が入っていなかった。インストールから作業。 Cygwin のセットアップツールの Net カテゴリーからそれらしいパッケージを選択してインストールする。

作業手順

コンソールでのコマンド実行、テキストエディターでの編集、ブラウザー上の操作を行う。

SSH 環境を構成する

Cygwin の ssh はクセがある。初期状態では $HOME をカスタマイズしている環境では dotfile を生成できないのだ。

そこでファイル /etc/nsswitch.conf を編集してパスを明示的に指示する:

db_home: /%H/Documents

%H が Windows の環境変数 USERPROFILE を意味する。

私は環境変数 $HOME を Windows の $USERPROFILE/Documents に指定しているのでこうなる。 実際には symlink を定義して別のところに実体があるが、ここでは簡略化して説明した。

RSA 鍵を作成する

パスフレーズを忘れたので RSA 鍵を作り直す。GitHub に登録されているのはいじる必要なし。

bash$ cd ~/.ssh
bash$ ssh-keygen -t rsa

ちょっと下手なことはここに書けないので、その都度調べることにしよう。

GitHub の SSH に関する設定を構成する

作り直した公開鍵を GitHub の設定ページに追加する。画面の UI を見れば手順はわかる。 べらぼうに長い文字列をテキストボックスに貼り付けて追加ボタンを押す。

bash$ putclip < ~/.ssh/is_rsa.pub

コンソールに戻って確認:

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

ローカルリポジトリーの設定を再構成する

コマンド git remote -v を実行すると https:// から始まるリモートリポジトリーのパスが表示されている。 これがダイアログ出現の直接原因らしいので、git:// に変更する。

前述のスクリプトの一部を流用して次のようにする:

local repos=(\
    /path/to/repos1 \
    /path/to/repos2 \
    ... \
    )
for repo in "${repos[@]}" ; do
    git -C $repo remote set-url origin git@github.com:showa-yojyo/${repo##*/}
    echo Changed to $(git -C $repo remote -v)
done

以上だ。