GitHubのSSH接続でフォルダごとにGitHubアカウントを変更する

### 目次
1.[SSH接続をする](##-SSH接続をする)
2.[生成時に秘密鍵のファイル名を指定する。](##-生成時に秘密鍵のファイル名を指定する)
3.[フォルダごとに接続するアカウント（＝SSH）を変更する](##-フォルダごとに接続するアカウント（＝SSH）を変更する)
4.[リポジトリをクローンするときの設定方法](##-リポジトリをクローンするときの設定方法)
5.[configはpushされる？](##-configはpushされる？)

## GitHubとSSH接続をする
VSCodeでGitHubのプライベートリポジトリをSSH接続で使用する手順は以下の通りです。

1. SSHキーを生成します（まだ生成していない場合）。ターミナルで以下のコマンドを実行し、指示に従ってください。

   ```
   ssh-keygen -t ed25519 -C "your_email@example.com"
   ```
   **※-C オプションをGitHubのアカウントにしておくと分かりやすい。**
   ```
   ssh-keygen -t ed25519 -C "hogehoge"
   ```
   こうするとRSAの長い鍵が生成される。
   ```
   ssh-keygen -t rsa -b 4096 -C "hogehoge"
   ```
2. 生成された公開鍵（デフォルトでは`~/.ssh/id_ed25519.pub`）の内容をコピーします。

3. GitHubアカウントの設定ページ（<a href="https://github.com/settings/keys">https://github.com/settings/keys</a>）を開き、新しいSSHキーを追加します。公開鍵の内容を貼り付けて保存します。

4. VSCodeを開き、コマンドパレット（Ctrl+Shift+P または Cmd+Shift+P）を開きます。

5. "Git: Clone"と入力して、"Git: Clone"コマンドを選択します。

6. クローンするプライベートリポジトリのSSH URLを入力します（`git@github.com:username/repository.git`の形式）。

7. リポジトリのクローン先となるローカルディレクトリを選択します。

8. クローンが完了したら、VSCodeでクローンしたリポジトリを開きます。

9. VSCodeのターミナルを開き、以下のコマンドを実行して、SSHキーを使用していることを確認します。

   ```
   ssh -T git@github.com
   ```

   "Hi username! You've successfully authenticated, but GitHub does not provide shell access."というメッセージが表示されれば、SSHキーが正しく設定されています。

これで、VSCodeでGitHubのプライベートリポジトリをSSH接続で使用できるようになります。ソースコントロールビューやターミナルから、Gitの操作（コミット、プッシュ、プル）を行えます。

SSH接続を使用することで、GitHubにアクセスするたびにユーザー名とパスワードを入力する必要がなくなり、よりセキュアな環境で開発を進められます。

## 生成時に秘密鍵のファイル名を指定する

SSHキーを生成する際に、ファイル名を指定することができます。これにより、既存の秘密鍵ファイルを上書きすることなく、新しい鍵ペアを作成できます。

以下の手順で、カスタムのファイル名を指定してSSHキーを生成します。

1. ターミナルを開き、`ssh-keygen`コマンドを実行します。`-f`オプションを使用して、鍵ペアのファイル名とパスを指定します。

   ```Linux:Linux/Mac
   ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/my_github_key
   ```
   ```PowerShell:PowerShell
   ssh-keygen -t ed25519 -C "your_email@example.com" -f $env:USERPROFILE/.ssh/my_github_key
   ```
   この例では、`~/.ssh/my_github_key`という名前で鍵ペアが生成されます。
      
   ```PowerShell:PowerShell
   ssh-keygen -t rsa -b 4096 -C "hogehoge" -f $env:USERPROFILE\.ssh\id_rsa_hogehoge
   ```
   この例では、`~/.ssh/id_rsa_hogehoge`という名前で鍵ペアが生成されます。
2. パスフレーズを設定するかどうかを聞かれます。セキュリティ上の理由から、パスフレーズを設定することが推奨されています。設定する場合は入力し、そうでない場合は空のままエンターキーを押します。

3. 鍵ペアが生成されると、指定したファイル名で秘密鍵（`my_github_key`）と公開鍵（`my_github_key.pub`）が`~/.ssh`ディレクトリに作成されます。

4. `config`ファイルを編集して、新しい秘密鍵ファイルを使用するようにSSH設定を更新します。`~/.ssh/config`ファイルを開き、以下の行を追加または修正します。

   ```
   Host github.com
     HostName github.com
     User git
     IdentityFile ~/.ssh/my_github_key
   ```

5. GitHubアカウントの設定ページ（<a href="https://github.com/settings/keys">https://github.com/settings/keys</a>）を開き、新しい公開鍵（`my_github_key.pub`の内容）を追加します。

6. 新しい鍵ペアが正しく設定されたことを確認するため、ターミナルで以下のコマンドを実行します。

   ```
   ssh -T git@github.com
   ```

   "Hi username! You've successfully authenticated, but GitHub does not provide shell access."というメッセージが表示されれば、新しい鍵ペアが正常に機能しています。

これで、既存の秘密鍵ファイルを上書きすることなく、カスタムのファイル名で新しいSSHキーペアを生成できました。VSCodeや他のGitクライアントで使用する際は、新しい秘密鍵のパスを指定するようにしてください。


## フォルダごとに接続するアカウント（＝SSH）を変更する

.git/config ファイル内で `[remote "origin"]` セクションの `url` には、SSH接続を使用するためのカスタムホスト名を指定できます。この方法は、`~/.ssh/config` ファイルでホスト名とSSHキーを定義している場合に特に便利です。

`~/.ssh/config` ファイルで以下のように `windows3_1` ホストを定義しているとします：

```
Host windows3_1
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_win31
```

この場合、`.git/config` ファイルの `[remote "origin"]` セクションで、`url` を以下のように設定できます：

```
[remote "origin"]
    url = git@windows3_1:hogehoge/gefugefu.git
```

この設定により、`hogehoge` リポジトリへのSSH接続に、`~/.ssh/id_rsa_win31` キーが自動的に使用されます。

このアプローチの利点は以下の通りです：

1. `~/.ssh/config` ファイルでSSH接続の詳細を一元管理できる。
2. `.git/config` ファイルでは、カスタムホスト名を使用してSSH接続を指定するだけでよい。
3. VSCodeを含む多くのGitクライアントは、この設定を自動的に認識する。

したがって、`[remote "origin"]` セクションの `url` にカスタムホスト名を使用することは、SSH接続を管理する効果的な方法だと言えます。複数のリポジトリを扱う場合、`~/.ssh/config` ファイルでSSH接続の詳細を一元管理し、各リポジトリの `.git/config` ファイルでカスタムホスト名を使用するのが良いでしょう。

## リポジトリをクローンするときの設定方法

SSH接続の準備ができたのちに、`git clone` を実行する前に `git init` を実行する必要はありません。

`git init` は、既存のディレクトリを新しい Git リポジトリとして初期化するために使用されます。これは、ローカルディレクトリで新しいリポジトリを作成する場合に使用します。

一方、`git clone` は、既存のリモートリポジトリのコピーをローカルマシンに作成するために使用されます。`git clone` コマンドは、新しいディレクトリを作成し、リモートリポジトリの内容をそのディレクトリにダウンロードして、自動的に新しい Git リポジトリとして初期化します。

したがって、`git clone` を実行するときは、`git init` を別途実行する必要はありません。`git clone` が、新しいリポジトリの初期化を含む全ての必要な作業を行います。

例えば、以下のコマンドは、`hogehoge/gefugefu` リポジトリのコピーを新しいディレクトリ `gefugefu` に作成します：

```
git clone git@windows3_1:hogehoge/gefugefu.git
```

このコマンドを実行した後、`gefugefu` ディレクトリには、リモートリポジトリの内容が含まれ、Git リポジトリとして初期化されています。

クローン後、`.git/config` ファイルを開いて、`[remote "origin"]` セクションの `url` を必要に応じて修正できます。例えば、`~/.ssh/config` ファイルでカスタムホスト名を定義している場合は、それに合わせて `url` を変更します。（※すでに自動設定されているはず）

```
[remote "origin"]
    url = git@windows3_1:hogehoge/gefugefu.git
```

この修正により、カスタムホスト名 `windows3_1` が使用され、`~/.ssh/config` ファイルで定義されている対応する SSH キーが自動的に選択されます。

`.git/config` ファイルを保存した後、`git fetch`、`git pull`、`git push` などの通常の Git コマンドを使用して、リモートリポジトリとの間で変更を同期できます。

この方法により、`git clone` でリポジトリを取得した後、`.git/config` ファイルを修正するだけで、カスタムの SSH 設定を使用できるようになります。

## configはpushされる？

`.git/config` ファイルは、通常、Git リポジトリの管理下に置かれておらず、`git push` コマンドを使用してリモートリポジトリにプッシュされることはありません。

`.git/config` ファイルは、ローカルリポジトリ固有の設定を保存するために使用されます。これには、リモートリポジトリの URL、ユーザー名、メールアドレス、その他のローカル設定が含まれます。これらの設定は、各開発者のローカル環境に固有のものであり、リポジトリを共有する他の開発者に影響を与えるべきではありません。

Git は、`.gitignore` ファイルに `.git/` ディレクトリ全体を含めることで、`.git/` ディレクトリとその内容がコミットやプッシュの対象から除外されるようにしています。これにより、ローカルの Git 設定がリモートリポジトリに誤ってプッシュされることを防ぎます。

ただし、リポジトリ全体を zip ファイルなどに圧縮して共有する場合は、`.git/` ディレクトリが含まれる可能性があるため、共有前に `.git/` ディレクトリを削除することをお勧めします。

したがって、`.git/config` ファイルを編集しても、その変更がリモートリポジトリにプッシュされることはないので、安心して必要な設定を行うことができます。