Git

【Git】事前準備

環境・事前準備

・macOS Ventura
GitHubの登録
・Gitのインストール
Homebrew:brew install git

「Git」は、コードのバージョン管理システムのひとつです。Gitを利用することで、特定のバージョンの差分を確認したり、バージョンを戻したりすることができます。

Gitでは、「リポジトリ」と呼ばれるファイルやディレクトリの変更履歴を管理する場所で、プロジェクトを管理します。

リポジトリには、自分のパソコン(ローカル)上の「ローカルリポジトリ」とWebサーバー上の「リモートリポジトリ」があります。

今回は、ローカルと一般的なリモートリポジトリである「GitHub」の間で通信するための事前準備について説明します。

GitHubへのSSH接続

ローカルからGitHubにアクセスする際は、公開鍵認証によるSSH接続が必要となります。

公開鍵認証については、【Raspberry Pi】SSHのページでも説明していますので、基本はそちらを参照してください。本頁では、補足とGitに特化した説明をします。

GitHubにSSH接続するには、以下の作業を行います。

  1. ローカルで秘密鍵と公開鍵を作成する。
  2. GitHubに公開鍵を登録する。

ローカルで秘密鍵と公開鍵を作成

ターミナルで「ssh-keygen」コマンドを使用することで、秘密鍵と公開鍵を作成することができます。

デフォルトのアルゴリズムは「RSA」ですが、より強固な暗号化アルゴリズムである「Ed25519」を指定します(「-t」オプションで指定)。

また、「-C」オプションでコメントを追加できます。GitHubでは、GitHubに登録したメールアドレスを追加するのが一般的です。

% ssh-keygen -t ed25519 -C "<email_address>"

# 鍵の保存場所を聞かれますが、通常デフォルトの場所に保存しますので、そのままリターンキーを押してください。
Enter file in which to save the key (/Users/<user_name>/.ssh/id_ed25519):
Created directory '/Users/<user_name>/.ssh'.

# 次に「パスフレーズ」の設定を求められます。任意ですので設定しない場合はそのままリターンキーを押してください。
Enter passphrase (empty for no passphrase): 

# 再度、パスフレーズの入力が求められます。設定していない場合はそのままリターンキーを押してください。
Enter same passphrase again: 

 

これで「~/.ssh/id_ed25519.pub」ファイル(公開鍵)と「~/.ssh/id_ed25519」ファイル(秘密鍵)が作成されます。

ssh-agentに秘密鍵を登録

秘密鍵を管理するプログラムである「ssh-agent」を設定します。

ssh-agentを使用することで、以下の利点がありますが、ssh-agentの使用は必須ではありません。

  • sshコマンドの「-i」オプション(秘密鍵を指定)を省略可能。
  • パスフレーズの入力が不要。
  • サーバーを跨いだ認証において、踏み台のサーバーに秘密鍵を保管する必要がない。

以下のコマンドでssh-agentを起動します。

% eval "$(ssh-agent)"

「eval」コマンドは、引数で与えられた文字列をコマンドとして実行します。

また、「$(command)」は、実行結果を出力し展開します。ダブルクォーテーションで囲むと文字列として解釈をしますので、「% eval "$(ssh-agent)"」は、「ssh-agentを実行した結果を文字列として解釈し、コマンドとして実行する」、ということを意味します。

ちなみに、「% ssh-agent」を実行すると、

SSH_AUTH_SOCK=/var/folders/...(省略)...; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3410; export SSH_AGENT_PID;
echo Agent pid 3410;

 

と出力されます。ssh-agent自体の起動はされますが、これだけでは各種環境変数が設定されないため、「SSH_AUTH_SOCK」と「SSH_AGENT_PID」に関するコマンドも別途実行する必要があります。

「eval」コマンドを使用することで、これらをいっぺんに実行することができます。

参考に、引用符について、以下にまとめます。

  • ' '(シングルクォーテーション):囲まれた部分は文字列として解釈される。
  • " "(ダブルクォーテーション):囲まれた部分は文字列として解釈される。ただし、変数が含まれている場合、その変数は展開される。
  • ` `(バッククォーテーション):囲まれた部分をコマンドとして実行(変数があり変数の中身がコマンドの場合も同様)し、実行結果が展開される。「$(command)」と同じ。

次に、ssh-agentに秘密鍵を登録します。「ssh-add」コマンドに続けて秘密鍵を指定すると、パスフレーズを聞かれます。これにより、ssh-agentに秘密鍵とパスフレーズが登録されます。

しかし、シェルを再起動する度に秘密鍵の情報はリセットされてしまい、都度「ssh-add」コマンドを実行する必要があります。macOSの場合、「keychain」(パスワードやアカウント情報を保管する機能)に秘密鍵を登録する「--apple-use-keychain」オプションを使うことができます。これにより、シェルを再起動しても秘密鍵の情報はリセットされなくなります。

% ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Enter passphrase for /Users/<user_name>/.ssh/id_ed25519: 
Identity added: /Users/<user_name>/.ssh/id_ed25519 (<email_address>)

# 登録した秘密鍵は「-l」オプションで確認できます。
% ssh-add -l
256 SHA256:<hash_value> (ED25519)

 

上記のコマンドにより、keychainに秘密鍵の情報が保存され、シェルの再起動時にもssh-agentがそれを自動的に読み込んでくれますが、PCをシャットダウンしてしまうと自動で読み込むことができません(keychainの情報は消えていません)。

「.ssh/config」ファイルに以下の情報を書き込むことで、シャットダウン後でもssh-agentがkeychainから情報を自動的に読み込むことができるようになります。

Host github.com  # 設定をGitHubに限定しています。限定しない場合は「*」としてください。
  AddKeysToAgent yes  # SSH接続時に使った秘密鍵の情報をssh-agentに追加します。追加された場合、次回以降のSSH時のパスフレーズが省略できます。(「ssh-add」コマンドに相当。)
  UseKeychain yes  # 秘密鍵の情報をkeychainに保存します。(「--apple-use-keychain」オプションに相当。)
  IdentityFile ~/.ssh/id_ed25519  # 使用する秘密鍵を指定します。SSH時に鍵の指定が不要となります。

GitHubに公開鍵を登録

「pbcopy」コマンドを使用して、公開鍵の中身をクリップボードにコピーします。

% pbcopy < ~/.ssh/id_ed25519.pub

 

GitHubマイページの右上にあるアイコンをクリックし、表示された「Settings」を選択し、左のメニューにある「SSH and GPG keys」を選択してください。

緑色の「New SSH key」ボタンをクリックし、以下の内容を登録して、緑色の「Add SSH key」ボタンを選択することで、公開鍵の登録ができます。

  • Title: 公開鍵を使用するコンピュータの名前等を登録すると良いです。
  • Key type:「Authentication Key(公開鍵)」か「Signing Key(署名付きの鍵)」を選択(通常は「Authentication Key」)。
  • Key:クリップボードにコピーした公開鍵の内容を貼り付け。

GitHubとのSSH接続テスト

以下のコマンドを使用してGitHubとのSSH接続テストを行います。

% ssh -T git@github.com

# 実行結果
The authenticity of host 'github.com (<IP_Address>)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

 

表示されたフィンガープリントが、GitHubの公開鍵フィンガープリント(こちらのページで確認できます)と一致することを確認し、同じであれば「yes」と入力します。

以下のようなコメントが表示されれば接続設定は完了です。

Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Hi <user_name>! You've successfully authenticated, but GitHub does not provide shell access.

ローカル側の設定

Gitの設定は「~/.gitconfig」ファイルに保存され、その設定は基本的にglobalで適用(全てのリポジトリに適用)されます。

「~/.gitconfig」ファイルの設定は、「git config」コマンド「--global」オプションに続き、「attribute」と「value」を指定することで行います。「--global」オプションがあることで、当該ユーザーのシステム全体(全てのリポジトリ)の設定となります。

なお、「--global」オプションを付けなかった場合、実行したリポジトリのみの設定となり、その内容は「~/.gitconfig」ファイルではなく、「.git/config」ファイル(ローカルリポジトリ内に作成されるリポジトリ独自の設定ファイル)に保存されます。

まず、GitHubのアカウント情報をGitに登録します。

% git config --global user.name "<user_name>"
% git config --global user.email "<email_address>"

 

次のコマンドで、設定した内容の一覧を確認できます。

% git config --global --list

 

ターミナル上でコマンドの結果が画面一杯に表示され(「pager」といいます。)、その画面から抜けるためにQキーやcommandキー+Cキー等を入力する必要があり面倒なこともあります。

以下のコマンドでpagerを無効にすることができますので、適宜利用してください。

% git config --global --replace-all core.pager "less -F -X"