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
と組み合わせて使うと便利!