SourceTree（Windows）と GitHub の連携手順

本記事での GitHub 連携は HTTPS で Personal access tokens を使用する。


# 環境
- Windows 10 Enterprise 22H2
- SourceTree 3.4.17


# GitHub で Personal access tokens を生成

[Personal Access Tokens (Classic)](https://github.com/settings/tokens) にアクセスする。

![github.com_settings_tokens.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/3ca7add3-2339-23f6-f1cf-b906fde796e5.png)

右上のドロップダウン `Generate new token` から `Generate new token (classic)` を選択する。

![github.com_settings_tokens_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/7b0e4a7c-d3a9-445d-4aec-f4bf5fa58447.png)

設定は好みだが、今回は以下のように設定した。

**Note** には利用用途がわかるように SourceTree と入力。
**Expiration**（有効期限）は `90 days` を選択。
**Select scopes**（トークンが利用可能な権限）は `repo` と `user` を選択。

`Generate token` をクリックしてトークンを生成する。

![github.com_settings_tokens_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/d72f0071-c24b-f4f0-aad4-c8b1179a6cb7.png)

生成されたトークン `XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` の部分をメモする。

# SourceTree に GitHub のアカウントを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/043d8ffb-c7a6-1173-3326-4e151c243717.png)

SourceTree のメニューより ツール > オプション > 認証 を選択し、追加をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/0fabc9b3-5e05-0855-deec-6f83622654d3.png)

|項目|選択値|
|---|---|
|ホスティングサービス|GitHub|
|優先するプロトコル|HTTPS|
|認証|Personal Access Token|

上記のように選択後 **Personal Access Token を再読み込み** をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/45d467a9-d3d8-04c5-c8ec-e7098d7eec41.png)

**ユーザー名** には GitHub のアカウント名を
**パスワード** には先ほど発行した Personal Access Token をそれぞれ入力して **OK** をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/3da8e08f-1b3d-9511-13cd-a4fde97431f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/c22a5225-2cf6-46a0-d025-1ca60c1f9caf.png)

認証に成功 と表示され、アカウントが追加されていればオーケー。

# SourceTree で GitHub のリモートリポジトリをクローン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/6d700380-266e-3641-702d-08acfe1fd8d3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/c22df905-3a6c-d67f-abc8-1ef85d5c1a77.png)

クローンを行う際に **CredentialHelperSelector** ダイアログが表示された場合は `manager-core` 及び `Always use this from now on` を選択する。
同ダイアログが 2回表示される場合、同じ選択を繰り返す。

https://nishikianago.hatenadiary.jp/entry/2023/02/20/001022
https://teratail.com/questions/mw4yzn2mzuowz4

# コミットユーザーの設定
GitHub 以外のホスティングサービスを併用している場合など、リポジトリ毎にコミットユーザーを使い分けたい場合がある。

SourceTree 右上の設定より、リポジトリ設定を表示する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/c0e47f9a-0009-2b62-a4df-30bf6a341f64.png)

**グローバルユーザー設定を使う** のチェックを外す。

**フルネーム** には GitHub のアカウント名を
**メールアドレス** には GitHub のアカウントに紐づけた自身のメールアドレス または GitHub が提供している noreply メールアドレスを入力する。

今回はセキュリティの観点から noreply メールアドレスを使用する。

自身の noreply メールアドレスは [Email settings](https://github.com/settings/emails) にて確認できる。
表示されていない場合は `Keep my email addresses private` のチェックが必要。

---

続いて SourceTree のターミナルを起動して、以下のコマンドを実行する。

```terminal
git config --local user.name "[GitHub Account Name]"
git config --local user.email "[ID]+[GitHub Account Name]@users.noreply.github.com"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/d3bb6d76-72e7-eca5-dc6d-70d0716d62db.png)

https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address
https://ai-can-fly.hateblo.jp/entry/github-email-private

# GitHub へのコミットに Verified マーク（署名）を付与する設定
https://zenn.dev/noraworld/articles/sign-commits-with-gpg-key
https://smile-jsp.hateblo.jp/entry/2020/08/12/125020

## GPG キーの生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/5235eb62-407e-6f8c-fd0b-600e2e9fed94.png)

```terminal
gpg --full-generate-key
```

### 鍵の種類を選択

```terminal
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?
```

Enter でデフォルトの RSA and RSA を指定する。

### 鍵の bit 数を指定

```
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
```

`4096` と入力して Enter で確定する。

### 鍵の有効期限を指定（無期限）

```
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
```

`0` と入力して Enter で確定する。

### 設定の確認

```
Is this correct? (y/N)
```

`y` と入力して Enter で確定する。

### 名前とメールアドレスの設定

```
Real name: naente
Email address: 47913993+naente@users.noreply.github.com
Comment:
```

Real name を訊ねられるが本名である必要はない。
Email address には GitHub の noreply メールアドレスを指定する。
Comment は未入力で問題ない。


### 最終確認

```
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
```

`O` と入力して Enter で確定する。

### パスフレーズの設定

GPG キーに任意のパスフレーズを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/9b1b50fd-bb81-5650-4c68-359b8b541655.png)

再入力を求められるので、もう一度同じパスフレーズを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/632d595f-1a05-c4b7-c65c-d223c3a16995.png)



```
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key XXXXXXXXXXXXXXXX marked as ultimately trusted
gpg: revocation certificate stored as '/c/Users/naente/.gnupg/openpgp-revocs.d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.rev'
public and secret key created and signed.

pub   rsa4096 2024-05-22 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid                      naente <47913993+naente@users.noreply.github.com>
sub   rsa4096 2024-05-22 [E]
```

GPG キーの生成が完了した。

## GitHub アカウントへ GPG キーを設定

### GPG キーの取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/ef890820-5a31-920a-9ec3-2fd7c2ff0c8f.png)

```terminal
gpg --list-secret-keys --keyid-format=long
```

以下のような情報が表示される。

```
/c/Users/naente/.gnupg/pubring.kbx
--------------------------------------
sec   rsa4096/9240835302B1CB2F 2024-05-22 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid                 [ultimate] naente <47913993+naente@users.noreply.github.com>
ssb   rsa4096/XXXXXXXXXXXXXXXX 2024-05-22 [E]
```

GPG キー ID (上記の例でいう 9240835302B1CB2F の部分) をクリップボードにコピーする。

コピーした GPG キー ID を指定して、以下のコマンドを実行する。

```terminal
gpg --armor --export 9240835302B1CB2F
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/9288db20-cc99-c0d2-2875-1c4cf004a1b5.png)

```
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGZNRgQBEADdnPSp7dDHv1H63JlAWt1i2apbo53dXC9IKgSQzLt5xY0al+Lo
PXa+nMtJVMJCDuXuosaQneN5tdkNACdGM1h95HnCnSTDcidYFzf+N93SlapG6VbR
RFde+4PabDhiUcyo53kt65geaUqqbULNFCyjH1WY5obuajYGNENmPkXVHAKfy7eF
jQOHASRhR3MWERK3ca3sbRPKjkD05XfEFT3ZcB1N+nryg8AaDtBsffzrrsF6WTBn
z+Y6eL8iF+MZiOBSv+6+Pta7zH/Mfspo1nRfvpkPJPF3W7ZzlMogQOMBbsA/MqCf
NeV3MtGWUmW7142RLz4mgMqYFYFsu3p8Hv3exmWCTSjgtg4Vbk9cPSSPItIqKy1l
SiNOzGHvUpcYJSlAdF2rwaFe0gOPQhi8UOHiUZC+wrX3qPnMS3E+HIWrx1SLxLBQ
kyJlyH1uF/QqIwcwdtm8SS/NwhLM6e8kHNJJRiyn0kv8uOmuqLY0dCFwivjViEWH
dtZzpEp3WCppNA9gD9hJjoOuVwkLe3vkk5tQkg7xuqz1S991Q/5Qex/U8dsqOPCi
...
-----END PGP PUBLIC KEY BLOCK-----
```

表示された GPG キーを `-----BEGIN PGP PUBLIC KEY BLOCK-----` と `-----END PGP PUBLIC KEY BLOCK-----` も含めてクリップボードにコピーする。

### GitHub アカウントへ GPG キーを登録

[Add new GPG key](https://github.com/settings/gpg/new)

![github.com_settings_gpg_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/b896a801-2fe5-4c0e-14b1-8493ee47a449.png)

Key フィールドへコピーした GPG キーを貼り付け `Add GPG key` をクリックして登録を完了する。

## Git に GPG 署名キーを設定

今回は対象のリポジトリへの署名にのみ GPG キーを使用したいので以下のコマンドを実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/8de06c26-e592-566c-0003-c7153444f4a7.png)

```
git config --local user.signingkey 9240835302B1CB2F
```

既定でコミットが署名されるように以下のコマンドを実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/9a40913d-2a18-4409-ff29-7c6a01522498.png)

```terminal
git config commit.gpgsign true
```

# 動作確認
SourceTree からプッシュできること、GitHub のページでコミットに署名が付与されていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/d7580e0d-e8a7-3cc3-1821-338af3fcacf3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/8906a694-4df0-48ef-dc1d-0b3775087abc.png)

GPG キーのパスフレーズを求められたら入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/14b00876-5993-6257-0329-ae9c7373a893.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/bdb924ee-ab3c-b41a-55e7-3ea998626395.png)

コミット内容に `Verified` の表示があれば成功。