git のリモートリポジトリを別の URL にリダイレクトして使う
ユースケース
- git プロトコルが禁止されている環境で https に読み替えて要求するようにしたいが、実行する git コマンド自体は変更したくない (できない) 場合
- インターネットアクセスが遅い、あるいはインターネットに大量に要求を出したくない場合に、LAN 内のミラーを使いたい場合
※ 2つ目のユースケース場合は単に remote URL を複数併用することでも可能。
設定方法
git config --global url."gitコマンド内部用URL".insteadOf ユーザー用のURL
- ダブルクォート(
"
)も必要です。 - 指定するURL は全部フルで指定しても、一部でもOK
覚え方
git config --global url."A".insteadOf B
url A insteadof B
→ (上記を英語の文章と考えて) gitコマンド視点で URL B の代わりに A を使う。
ユーザー視点では B のほうを使います。
git clone B
とすると実際には A にアクセスします。
具体例 (URL の全部を置換する場合)
git://git.yoctoproject.org/poky
のたぶん私的なミラーのひとつで https://github.com/lgirdk/poky.git を使います。(google で最初に見つかったもの)
本家に直接アクセス
本家に直接アクセスする場合は以下のような感じです。
$ git clone git://git.yoctoproject.org/poky
Cloning into 'poky'...
remote: Enumerating objects: 483545, done.
remote: Counting objects: 100% (483545/483545), done.
remote: Compressing objects: 100% (114242/114242), done.
remote: Total 483545 (delta 361934), reused 483108 (delta 361625)
Receiving objects: 100% (483545/483545), 166.03 MiB | 15.71 MiB/s, done.
Resolving deltas: 100% (361934/361934), done.
insteadOf の設定
$ git config --global url."https://github.com/lgirdk/poky.git".insteadOf git://git.yoctoproject.org/poky
上記コマンドを実行すると ~/.gitconfig
に以下が追加されます。
[url "https://github.com/lgirdk/poky.git"]
insteadOf = git://git.yoctoproject.org/poky
insteadOf の設定後に、本家にアクセスしてるつもりでリダイレクト先にアクセスする
$ git clone git://git.yoctoproject.org/poky
Cloning into 'poky'...
remote: Enumerating objects: 8909, done.
remote: Counting objects: 100% (8909/8909), done.
remote: Compressing objects: 100% (1274/1274), done.
remote: Total 483972 (delta 7996), reused 8310 (delta 7618), pack-reused 475063
Receiving objects: 100% (483972/483972), 160.07 MiB | 15.77 MiB/s, done.
Resolving deltas: 100% (362350/362350), done.
こちらでは、最初の clone の結果より、Enumerating objects
のところの数字が少ないことを確認できます。
ミラーに直接アクセス
以下と同じことを確認できます。
$ git clone https://github.com/lgirdk/poky.git
Cloning into 'poky'...
remote: Enumerating objects: 8909, done.
remote: Counting objects: 100% (8909/8909), done.
remote: Compressing objects: 100% (1274/1274), done.
remote: Total 483972 (delta 7996), reused 8310 (delta 7618), pack-reused 475063
Receiving objects: 100% (483972/483972), 160.07 MiB | 18.84 MiB/s, done.
Resolving deltas: 100% (362350/362350), done.
具体例 (URL の一部を置換する場合)
git://git.yoctoproject.org/poky
の正式なミラーは https://git.yoctoproject.org/git/poky です。
https://git.yoctoproject.org/git
の部分と git://git.yoctoproject.org
の部分が共通しています。
$ git config --global url."https://git.yoctoproject.org/git".instead git://git.yoctoproject.org
~/.gitconfig に以下が足されます。
[url "https://git.yoctoproject.org/git"]
instead = git://git.yoctoproject.org
以下のようになります。
$ git clone git://git.yoctoproject.org/poky
Cloning into 'poky'...
remote: Enumerating objects: 483596, done.
remote: Counting objects: 100% (483596/483596), done.
remote: Compressing objects: 100% (114250/114250), done.
remote: Total 483596 (delta 361977), reused 483179 (delta 361666)
Receiving objects: 100% (483596/483596), 166.06 MiB | 16.86 MiB/s, done.
Resolving deltas: 100% (361977/361977), done.
参考 URL
https://git-scm.com/docs/git-config の url.<base>.insteadOf
https://yu8mada.com/2018/10/31/how-to-treat-an-url-specified-in-https-as-one-for-ssh-when-cloning-a-repository-in-github/
https://kakakakakku.hatenablog.com/entry/2020/03/27/093150