git のリモートリポジトリを別の URL にリダイレクトして使う

# 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