git-config(~/.gitconfig など)に url.<base>.insteadOf もしくは url.<base>.pushInsteadOf を設定すると,Git リポジトリ URL(プロトコル含む)を書き換えることができる.例えば GitHub リポジトリを git pull するときは HTTPS URL を強制し,git push するときは SSH URL を強制するなど.今回は実際に設定を試しながら整理する.
url.<base>.insteadOf を試す
まず,git-config に url.<base>.insteadOf を設定すると,全てのオペレーションに対して Git リポジトリ URL を書き換える.例えば,以下のワンライナーを実行する.
$ git config --global url.git@github.com:.insteadOf https://github.com/
すると,自動的に .gitconfig に設定が追加される.意味としては https://github.com/ を含む HTTPS URL を SSH URL に書き換える.
[url "git@github.com:"]
insteadOf = https://github.com/
実際にサンプルリポジトリ(パブリック)を HTTPS URL で git clone し,リモート設定を確認すると,SSH URL に書き換わっていた.実際に動作確認をすると,git pull も git push も SSH URL の挙動になっていた.
$ git clone https://github.com/kakakakakku/sandbox-public.git Cloning into 'sandbox-public'... (中略) $ git remote -v origin git@github.com:kakakakakku/sandbox-public.git (fetch) origin git@github.com:kakakakakku/sandbox-public.git (push)
url.<base>.pushInsteadOf を試す
今度は git-config に url.<base>.pushInsteadOf を設定すると,プッシュオペレーションに対して Git リポジトリ URL を書き換える.例えば,以下のワンライナーを実行する.
$ git config --global url.git@github.com:.pushInsteadOf https://github.com/
すると,自動的に .gitconfig に設定が追加される.意味としては https://github.com/ を含む HTTPS URL に対するプッシュオペレーションを SSH URL に書き換える.
[url "git@github.com:"]
pushInsteadOf = https://github.com/
実際にサンプルリポジトリ(パブリック)を HTTPS URL で git clone し,リモート設定を確認すると,push のみ SSH URL に書き換わっていた.実際に動作確認をすると,git pull のみ SSH URL の挙動になっていた.
$ git remote -v origin https://github.com/kakakakakku/sandbox-public.git (fetch) origin git@github.com:kakakakakku/sandbox-public.git (push)
HTTPS URL を使う場合は username と password を毎回入力する必要があるけど,GitHub ドキュメントに書いてある通り「認証情報ヘルパー (Credential Helper)」を使えば,キャッシュできる.
url.<base>.insteadOf に username まで含める
git-config ドキュメントを読むと,URL 設定はあくまで「文字列一致(最長一致)」となり,例えば以下のワンライナーのように kakakakakku まで含めることもできる.
$ git config --global url.git@github.com:kakakakakku.insteadOf https://github.com/kakakakakku
すると,https://github.com/kakakakakku を含む HTTPS URL を SSH URL に書き換える.URL によって柔軟に url.<base>.insteadOf と url.<base>.pushInsteadOf を設定できるのは,環境が多いほど便利そう.
[url "git@github.com:kakakakakku"]
insteadOf = https://github.com/kakakakakku
実際に kakakakakku/sandbox-public と rails/rails でリモート設定を確認すると,確かに限定的に適用されていた.
$ git remote -v origin git@github.com:kakakakakku/sandbox-public (fetch) origin git@github.com:kakakakakku/sandbox-public (push) $ git remote -v origin https://github.com/rails/rails (fetch) origin https://github.com/rails/rails (push)
まとめ
git-config(~/.gitconfig など)に設定できる url.<base>.insteadOf と url.<base>.pushInsteadOf を試した.GitHub ドキュメントに HTTPS URL 推奨と書いてあり,HTTPS URL を軸に使いながら,部分的に SSH URL を使ったりすると良さそう.例えば ghq get もデフォルトは HTTPS URL で git clone をするため,url.<base>.insteadOf と url.<base>.pushInsteadOf と組み合わせて使うと便利!