GitHubでSourceTreeのPAT認証が失敗する問題の解決方法（個人とOrganizationそれぞれ）

# 概要

GitHubのリポジトリへSourceTreeからアクセスする場合に、OAuthだと操作の度にアカウント選択画面が出て不便です。そのためPATを発行して認証しようとしたのですが、SourceTree(Windows)でPATを入れても認証失敗してしまい、なかなか上手く行きません。けっきょく、個人ユーザーの認証とOrganizationの認証それぞれで別の解決方法が必要になりました。それを紹介します。ちなみにPAT以外でも解決できたのでそれも補足します。

# 最初に結論まとめ

## 個人ユーザーのリポジトリ

PAT発行時に、Account permissionsのEmail-AddressのRead権限を割り当てる必要があります。それで解決です。

## Organizationのリポジトリ

SourceTree自体では解決できませんでした。Cloneする時にリモートリポジトリのアドレスに次のようにPATを含めることで、ローカルリポジトリに認証情報を残すことで解決はできます。

`https://<ユーザー名>:<PAT>@github.com/<YourOrganization>/<YourRepository>.git`

ただしこれはローカルリポジトリへコマンドを打てばPATが見えてしまうので、用途に求められるセキュリティ次第だと思います。

## Basic認証

PATとは別の話ですが・・・設定画面でOAuth認証を登録せず、認証情報が無い状態でClone等からアクセスしてBasic認証すれば、何度もダイアログが出てくる問題は解決できました。

# 説明

## 上手く行かなかったこと

GitHubのOrganizationで管理しているPrivateリポジトリへ、SourceTree（Windows）からアクセスしたいことって、ありますよね。ないという幸運な人はたぶんこの記事をスキップしてもらってOKです。

SourceTreeの設定画面からOAuthで登録すると、こういうダイアログで登録することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616143/ed6aee74-2da2-43f3-af13-17682811a416.png)

これ自体は問題ないのですが、選択を記憶してくれないのか、push,fetchなどGitHubのアクセスが必要な操作をする度にこのウインドウが出てきます。これはけっこう手間です。

他のもっと手間の掛からない方法はないのかと模索したところ、PATを発行してSourceTreeへ登録するしかなさそうです。※後で書きますが、Basic認証での解決方法もありました

PATの手順は色々なWebサイトで紹介されているのでそれに従って

1. GitHubで新しい方の「fine-grained personal access token」を作成
1. パーミッションはリポジトリの「Contents」のRead/Writeを許可
1. SourceTreeの設定画面の認証でこれを入力

という手順で簡単に・・・ダメでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616143/5613e744-e606-48b1-a8e6-6e3b78442905.png)

## 個人ユーザーのPAT

個人ユーザーのPATについては、さらに「Account permissions」の「Email-Address」のRead権限を追加したら、同じ操作で認証成功しました。

そういう手順が必要だという情報は見かけなかったのですが、Atlassianのフォーラムで「user情報の読み込みが許可されているか」という一言があったので気付きました。

https://community.atlassian.com/forums/%E3%82%A2%E3%83%88%E3%83%A9%E3%82%B7%E3%82%A2%E3%83%B3%E5%85%AC%E5%BC%8F-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A9%E3%83%A0-discussions/GitHub%E3%81%AE%E8%AA%8D%E8%A8%BC%E3%81%A7Personal-access-tokens%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E8%AA%8D%E8%A8%BC%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84/td-p/2631523

しかしこれでは、個人ユーザーで所有しているリポジトリにしかアクセスできません。OrganizationのリポジトリにアクセスするにはOrganizationのPATが必要です。

## OrganizationのPAT

同じように解決できるかと思いましたが、ダメでした。試しに全ての権限をRead許可しても結果は変わらないので、こちらはパーミッションの問題ではないようです。記事を書いておいてなんですが、SourceTreeで認証を通す方法はまだ見つけられていません。

代わりに、SourceTreeではなくローカルのリポジトリ側で解決する方法を見つけました。

Cloneする時のURLに次のようにしてユーザー名とPATを含めることで、PATで認証を通すことができます。

`https://<ユーザー名>:<PAT>@github.com/<YourOrganization>/<YourRepository>.git`

例えば`https://contoso/rep.git`を使いたい場合は、`git clone https://username:github_pat_xxxxxxxxxxxxxxx@github.com/contoso/rep.git`といった感じです。

この方法ならば、SourceTreeかどうかなどのgitクライアント側の事情に関係なく、このリポジトリを操作する時は認証が通ります。

この場合はCloneしたローカルのリポジトリに情報が記録されますので、`git remote -v`等でも値を見ることができます。セキュリティ的にいまいちな感じもありますが、ローカルにだけ保存されるものではありますし、万一の場合はPATなので失効させることもできますから、これで許容可能というケースも多いと思います。

## おまけ:OAuthでの認証の別案

SourceTreeの設定画面から認証情報をOAuthで登録すると、前述のように何度もダイアログがでてきます。

認証情報を登録せず、Clone画面などから直接アクセスすると、次のようなログイン画面がでてきます。こちらでログインすればBasic認証として登録され、何度もダイアログが出てくる問題は解決するようです。PATについてはここまでに書いたとおりですが、PATを使わない解決策としてはこれで良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616143/ed052f9b-a85b-4c25-9940-cd0e210f82cc.png)


# まとめ

SourceTreeへのPATの設定程度ならあちこちに情報があるし簡単だろう、と思ったら意外に手間取りました。欠点もあるもののいちおう解決策にたどり着いたので、同じ事に引っかかっている人がいたら参考になると嬉しいです。