@znz blog

ZnZ の memo のようなもの

githubでhttpsのURLを指定してもgitプロトコルやssh経由にする方法

| Comments

要約すると url.<base>.insteadOfurl.<base>.pushInsteadOf を使えば良いという話です。 github 以外でも使えます。

設定例

自分では今のところ、以下の設定にしています。

最初の [url "git@github.com:"] のセクションは URL の指定として https:git: を使っていても git push のときには ssh 経由にする、 という意味になります。

次の [url "git://github.com/"] は、その他の git fetchgit pull の時は https: の代わりに git: を使うという意味になります。

~/.gitconfig
1
2
3
4
5
[url "git@github.com:"]
  pushInsteadOf = git://github.com/
  pushInsteadOf = https://github.com/
[url "git://github.com/"]
  insteadOf = https://github.com/

pushInsteadOf なしの場合

pushInsteadOf を指定せずに insteadOf だけの場合は git push の時も insteadOf の設定が使われます。

例えば設定例とは逆に、 proxy を通さないといけないとかの理由で すべて https に統一したいのなら 以下のような設定になると思います。

~/.gitconfig
1
2
3
[url "https://github.com/"]
  insteadOf = git@github.com:
  insteadOf = git://github.com/

コマンドでの設定方法

git config コマンド経由で pushInsteadOf を設定するなら、 以下のように指定します。

~/.gitconfiggithub.token などの秘密にすべき情報が入っていて 共有しにくい時にはコマンドで設定できた方が便利です。

1
2
3
4
GITHUB_URL_PREFIX="url.git@github.com:"
git config --global --remove-section "$GITHUB_URL_PREFIX" || :
git config --global       "$GITHUB_URL_PREFIX".pushInsteadOf "git://github.com/"
git config --global --add "$GITHUB_URL_PREFIX".pushInsteadOf "https://github.com/"

設定確認方法

実際にどういう URL が使われるのかは git remote -v で確認できます。

.git/configremoteurl と見比べると ちゃんと設定が反映されていることがわかると思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git remote -v
origin   git://github.com/znz/rbenv-plug.git (fetch)
origin   git@github.com:znz/rbenv-plug.git (push)
$ cat .git/config
[core]
 repositoryformatversion = 0
 filemode = true
 bare = false
 logallrefupdates = true
 ignorecase = true
 precomposeunicode = false
[remote "origin"]
 url = https://github.com/znz/rbenv-plug.git
 fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
 remote = origin
 merge = refs/heads/master

URL の選ばれ方

github の URL で説明していますが、 git の機能なので他の URL でも当然使えます。

URL は最初の部分だけ見て、最長一致するものが使われるようです。 git 1.8.4.3 の git config --helpWhen more than one insteadOf strings match a given URL, the longest match is used. と書いてあります。

まとめ

~/.gitconfig での記述例の話はよくあるのですが、 コマンドでの設定方法とか、 設定の確認方法を見かけたことがなかったので、 まとめてみました。

そして github 以外でも使えるという話も付け加えておきました。

2014-07-05 追記: GOPATHとghqの設定を変更した話とgitconfigのコマンドでの設定の話 に関連する話を書きました。

Comments