kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Git リポジトリ URL を書き換える git-config の設定 "insteadOf" と "pushInsteadOf"

git-config(~/.gitconfig など)に url.<base>.insteadOf もしくは url.<base>.pushInsteadOf を設定すると,Git リポジトリ URL(プロトコル含む)を書き換えることができる.例えば GitHub リポジトリを git pull するときは HTTPS URL を強制し,git push するときは SSH URL を強制するなど.今回は実際に設定を試しながら整理する.

git-scm.com

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 URLSSH URL に書き換える.

[url "git@github.com:"]
    insteadOf = https://github.com/

実際にサンプルリポジトリ(パブリック)を HTTPS URLgit clone し,リモート設定を確認すると,SSH URL に書き換わっていた.実際に動作確認をすると,git pullgit pushSSH 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 URLgit 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 を使う場合は usernamepassword を毎回入力する必要があるけど,GitHub ドキュメントに書いてある通り「認証情報ヘルパー (Credential Helper)」を使えば,キャッシュできる.

help.github.com

url.<base>.insteadOfusername まで含める

git-config ドキュメントを読むと,URL 設定はあくまで「文字列一致(最長一致)」となり,例えば以下のワンライナーのように kakakakakku まで含めることもできる.

$ git config --global url.git@github.com:kakakakakku.insteadOf https://github.com/kakakakakku

すると,https://github.com/kakakakakku を含む HTTPS URLSSH URL に書き換える.URL によって柔軟に url.<base>.insteadOfurl.<base>.pushInsteadOf を設定できるのは,環境が多いほど便利そう.

[url "git@github.com:kakakakakku"]
    insteadOf = https://github.com/kakakakakku

実際に kakakakakku/sandbox-publicrails/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>.insteadOfurl.<base>.pushInsteadOf を試した.GitHub ドキュメントに HTTPS URL 推奨と書いてあり,HTTPS URL を軸に使いながら,部分的に SSH URL を使ったりすると良さそう.例えば ghq get もデフォルトは HTTPS URLgit clone をするため,url.<base>.insteadOfurl.<base>.pushInsteadOf と組み合わせて使うと便利!

help.github.com