SourcetreeでGitHubのプライベートリポジトリをクローンする方法【トークン認証】
SourcetreeでGitHubのプライベートリポジトリをクローンするとき、GitHubのアカウントパスワードは使えません。結論から書くと、GitHubでアクセストークン(Personal Access Token)を発行し、Sourcetreeにはパスワードの代わりにそのトークンを入力します。
GitHubは2021年8月13日に、Git操作でのパスワード認証の受け付けを終了しました。それ以降は、アクセストークン・OAuth・SSHキーのいずれかでしか認証できません。さらにSourcetreeのOAuth連携は公開リポジトリの読み取り権限しか要求しないため、OAuthで連携するとプライベートリポジトリが一覧に出てこないという問題があります。
この記事では、その回避策も含めて、Sourcetreeでプライベートリポジトリをクローンする手順を最後までまとめます。
なぜGitHubのパスワードではクローンできないのか
GitHubは2021年8月13日をもって、Git操作でのアカウントパスワード認証を廃止しました。現在、認証に使えるのは次の4つです。
- Personal Access Token(アクセストークン)
- OAuth トークン
- SSHキー
- GitHub App のインストールトークン
古い記事の手順どおりにパスワードを入力すると、Support for password authentication was removed on August 13, 2021.というエラーが返ってきます。このエラーが出たら、認証方法そのものを変える必要があるという合図です。
Sourcetreeのダウンロードとインストール
SourcetreeはAtlassianが提供している無料のGitクライアントです。macOS版とWindows版があり、どちらも公式サイトから入手します。
公式サイトからダウンロードする
公式サイトにアクセスして、使っているOS向けの最新バージョンをダウンロードします。
インストールする
ダウンロードしたインストーラを実行し、画面の指示に従って進めます。初回起動時にAtlassianアカウントでのログインを求められますが、GitHubのリポジトリを扱うだけならスキップして構いません。
GitHubでアクセストークンを発行する
先にGitHub側でトークンを作ります。GitHubのアカウントが必要なので、持っていなければ先にGitHubで作成してください。
classicとfine-grainedはどちらを使うか
アクセストークンには2種類あります。特定のリポジトリだけをクローンしたいならfine-grained、細かく考えたくないならclassicです。
▼2種類のアクセストークンの違い
| 項目 | classic | fine-grained |
|---|---|---|
| 権限の指定 | scope(repo など広い単位) | リポジトリごと・操作ごとに指定 |
| 対象リポジトリ | そのユーザーがアクセスできる全て | 選んだリポジトリのみ |
| 有効期限 | 無期限にもできる | 最長366日 |
| 発行できる数 | 制限なし | 1ユーザーあたり50個まで |
| GitHubの推奨 | - | こちらを推奨 |
権限が漏れたときの被害範囲が小さいのはfine-grainedです。特に業務のリポジトリを扱うなら、対象を絞れるこちらを選んでください。
トークンを発行する手順
GitHubの画面右上のアイコンから進みます。
- 「Settings」を開く
- 左メニューのいちばん下「Developer settings」を開く
- 「Personal access tokens」を開き、種類を選ぶ
- 「Generate new token」をクリックする
- 名前と有効期限を設定し、権限を指定する
- 発行されたトークンをコピーする
権限は、classicならrepoにチェックを入れます。ここにチェックが無いとプライベートリポジトリを読み書きできません。fine-grainedの場合は、対象リポジトリを選んだうえで「Contents」を「Read and write」にします。
発行されたトークンは、この画面を離れると二度と表示されません。閉じる前に必ずコピーしておいてください。紛失した場合は作り直しになります。
SourcetreeにGitHubアカウントを追加する
発行したトークンをSourcetreeに登録します。認証タイプは「OAuth」ではなく「Basic」を選ぶのがポイントです。
OAuthを選ぶとプライベートリポジトリが見えない
SourcetreeのOAuth連携は、GitHubに対して公開リポジトリの読み取り権限しか要求しません。そのため、OAuthで連携するとリポジトリ一覧にプライベートリポジトリが出てこず、書き込みもできません。
これはSourcetreeとGitHubの連携で長く知られている挙動です。プライベートリポジトリを扱うなら、Basic認証にユーザー名とアクセストークンを入れる方法が確実です。
Mac版の設定手順
メニューバーの「Sourcetree」→「設定」(バージョンによっては「環境設定」)を開き、「アカウント」タブから追加します。
- 「追加」ボタンをクリックする
- ホスティングサービスで「GitHub」を選ぶ
- 認証タイプで「Basic」を選ぶ
- ユーザー名にGitHubのユーザー名を入力する
- パスワード欄に、先ほど発行したアクセストークンを貼り付ける
- プロトコルは「HTTPS」を選ぶ
Windows版の設定手順
メニューバーの「ツール」→「オプション」を開き、「認証」タブから追加します。以降の入力内容はMac版と同じで、認証タイプに「Basic」を選び、パスワード欄にアクセストークンを貼り付けます。
プライベートリポジトリをクローンする
アカウントの登録が終われば、クローン自体はすぐ終わります。
リポジトリのURLをコピーする
GitHubでクローンしたいリポジトリを開き、緑色の「Code」ボタンから「HTTPS」のURLをコピーします。SSHキーを設定していない段階では、SSHのURLを選ばないよう注意してください。
Sourcetreeでクローンする
Sourcetreeのメニューから「ファイル」→「クローン / 新規作成」を選びます。
- 「元のパス / URL」にコピーしたURLを貼り付ける
- 保存先のローカルフォルダを指定する
- 「クローン」をクリックする
URLを貼り付けた時点で認証が通れば、リポジトリ名とブランチが自動で読み込まれます。ここで赤いエラーが出る場合は、認証がまだ通っていません。
クローンできないときの確認ポイント
つまずくのはほぼ認証まわりです。症状ごとに見るべき場所が違います。
▼症状と対処
| 症状 | 原因と対処 |
|---|---|
| パスワード認証のエラーが出る | パスワードを入力している。アクセストークンに置き換える |
| リポジトリ一覧に出てこない | OAuthで連携している。Basic認証+トークンで登録し直す |
| 読めるが push できない | トークンの権限不足。classicならrepo、fine-grainedならContentsをRead and writeにする |
| 急に認証が通らなくなった | トークンの有効期限切れ。GitHubで再発行して登録し直す |
| 古い認証情報が残っている | Mac標準のキーチェーンアクセスでGitHubの項目を削除し、Sourcetreeを再起動する |
いちばん多いのは、有効期限切れに気づいていないケースです。fine-grainedは最長366日なので、いつか必ず切れます。
SSHキーを使う方法もある
トークンの有効期限を管理したくないなら、SSHキーで認証する方法もあります。鍵を一度登録してしまえば期限切れがなく、複数リポジトリをまとめて扱えます。
手順としては、ローカルで鍵ペアを作り、公開鍵をGitHubの「Settings」→「SSH and GPG keys」に登録し、SourcetreeのアカウントでプロトコルにSSHを選びます。クローン時のURLも、HTTPSではなくSSHのものを使います。
鍵ファイルの形式を変換したい場面もあります。そのあたりはMacターミナルで鍵認証のpemとppkを相互変換するにまとめました。
なお、SourcetreeはGitHub以外のホスティングサービスにも同じ考え方で接続できます。AWS環境でGitを使う場合はSourcetreeとAWS CodeCommitを使用してソースコードを管理するを、クローンしたリポジトリからサーバーへ反映する流れはDockerで開発したLaravelのWebサイトをgitでXserverにデプロイするを参考にしてください。
▼HTML/CSS/JavaScriptの学習本を探している方はこちら