🎭

普段は https を使って git clone しつつ submodule だけ ssh で接続する方法

2023/03/02に公開

Gitにおいて普段はhttpsで接続しつつも、特定のsubmoduleだけsshで接続する方法を解説します。

背景

GitでCloneする方法としてhttpsとSSHがありますが皆さんはどちらをお使いでしょうか。

私は普段httpsで接続しています。最近はGitHubにおいてFine-grained personal access tokensという新機能が登場し、Personal access tokenがアクセスできるリポジトリと機能を絞れるようになったので、SSH接続と比較して安全性が高まっています。

https://github.blog/2022-10-18-introducing-fine-grained-personal-access-tokens-for-github/

一方、執筆時点ではSSH接続をされている方がかなり多いため、 submoduleの参照先がSSHに設定されている場面がよくあります。

普段はhttps接続を使いつつ、特定のリポジトリのsubmoduleのみSSHで接続する方法を解説します。

(拙ポートフォリオサイトのリポジトリで使用しているsubmoduleを例に紹介します。)

鍵を生成

まずは、特定のリポジトリ用のSSH鍵を生成します。GitHubのドキュメントにとてもわかりやすいドキュメントがあるので真似しながら設定してみます。

(恥ずかしながらEdDSAというアルゴリズムを使ったことがなかったのですが、ドキュメントで勧められていたので使ってみます。)

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key

ssh-keygen -t ed25519 -C "github-bicstone-portfolio-submodule" -f "github-bicstone-portfolio-submodule"
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in github-bicstone-portfolio-submodule.
Your public key has been saved in github-bicstone-portfolio-submodule.pub.
The key fingerprint is:
(省略)

EdDSAアルゴリズムを用いると噂通り公開鍵長が短くなっていて驚きました。

公開鍵を登録

下記を参考に生成された公開鍵をGitHubに登録します。今回の用途だとsubmoduleからプッシュすることはないので "Allow write access" のチェックは外しておきます。

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

Git の設定

該当のリポジトリをsubmoduleに追加したいリポジトリを開き、次のコマンドを実行します。

git -cとは、一時的にconfigを設定した上で実行するオプションです。親のリポジトリではSSH接続をしないので、 submoduleを追加するタイミングのみ特定のSSH鍵を参照するように設定します。

git -c core.sshCommand="ssh -i ~/.ssh/github-bicstone-portfolio-submodule" submodule add git@github.com:bicstone/portfolio-static.git static

無事追加されたら、submodule内に入ります。

cd static

そして、submodule内でSSH鍵の参照設定を恒久化します。

git config --local core.sshCommand "ssh -i ~/.ssh/github-bicstone-portfolio-submodule"

以上で、メインのリポジトリではhttpsを用いた接続、submoduleでは特定のSSH鍵を用いたSSH接続という使い分けを実現できました。

追加されたsubmoduleをcloneしてきた際に初期化する時も同様に行えます。

git -c core.sshCommand="ssh -i ~/.ssh/github-bicstone-portfolio-submodule" submodule update --init --recursive
cd static
git config --local core.sshCommand "ssh -i ~/.ssh/github-bicstone-portfolio-submodule"

まとめ

submoduleは使わないに越したことはないですが、やはり便利なので使ってしまいますね。みなさんもFine-grained personal access tokensに移行しましょう。

大事なのでもう一度貼っておきます (布教)

https://github.blog/2022-10-18-introducing-fine-grained-personal-access-tokens-for-github/

Discussion