本文へ移動
Vast Cowのブログ
前のページへ戻る

GitHubのユーザー名だけでGitのコミット用ユーザー情報を設定するシェルスクリプト

この記事を編集

複数のGitHubアカウントを使っていると、リポジトリごとにコミットの作成者情報を設定するのが少し面倒です。

git config --local user.name "your-username"
git config --local user.email "12345678+your-username@users.noreply.github.com"

特にGitHubの数値ユーザーIDを毎回調べるのは手間です。そこで、GitHubのユーザー名を渡すだけで、現在のリポジトリに user.name と user.email を設定するスクリプトを作りました。

何をするスクリプト?

例えば、Gitリポジトリ内で次のように実行します。

./git-config-gh.sh octocat

スクリプトはGitHub REST APIからユーザーの id と login を取得し、次の形式で設定します。

user.name  = octocat
user.email = <数値ID>+octocat@users.noreply.github.com

git config --local を使うため、現在のリポジトリだけに適用され、グローバル設定は変更しません。

必要なもの

gh(GitHub CLI)のインストールや、gh auth switch によるログインアカウントの切り替えは不要です。

スクリプト

以下を git-config-gh.sh として保存します。

#!/usr/bin/env bash
set -euo pipefail

usage() {
  printf 'Usage: %s <github-username>\n' "${0##*/}" >&2
}

if [[ $# -ne 1 || -z "$1" ]]; then
  usage
  exit 1
fi

username="$1"
if [[ ! "$username" =~ ^[A-Za-z0-9]([A-Za-z0-9-]{0,37}[A-Za-z0-9])?$ ]]; then
  printf 'Invalid GitHub username: %s\n' "$username" >&2
  exit 1
fi

for command in curl jq git; do
  if ! command -v "$command" >/dev/null 2>&1; then
    printf 'Required command not found: %s\n' "$command" >&2
    exit 1
  fi
done

if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
  printf 'Run this command inside a Git working tree.\n' >&2
  exit 1
fi

if ! response="$(curl --fail --silent --show-error --location \
  --connect-timeout 5 --max-time 15 \
  "https://api.github.com/users/${username}")"; then
  printf 'Failed to fetch GitHub user: %s\n' "$username" >&2
  exit 1
fi

if ! user_info="$(jq -er '
  select(.id | type == "number")
  | select(.login | type == "string" and length > 0)
  | [.id, .login, (.name // .login)]
  | @tsv
' <<< "$response")"; then
  printf 'Unexpected GitHub API response for: %s\n' "$username" >&2
  exit 1
fi

IFS=$'\t' read -r id login name <<< "$user_info"
email="${id}+${login}@users.noreply.github.com"

git config --local user.name "$name"
git config --local user.email "$email"

printf 'user.name  = %s\n' "$(git config --local user.name)"
printf 'user.email = %s\n' "$(git config --local user.email)"

使い方

実行権限を付けます。

chmod +x git-config-gh.sh

設定したいリポジトリ内で実行します(スクリプトを別の場所に保存した場合は、そのパスを指定します)。

cd /path/to/repository
/path/to/git-config-gh.sh octocat

設定を確認するには、次のコマンドを使います。

git config --local --get user.name
git config --local --get user.email

頻繁に使うなら、スクリプトを ~/bin/git-config-gh などのPATHが通った場所に置くと便利です。

仕組み

1. GitHub REST APIからユーザー情報を取得

GitHubには、ユーザー名から公開プロフィールを取得できるAPIがあります。

curl -fsSL https://api.github.com/users/octocat | jq '{id, login}'

id はGitHub内部の数値ユーザーID、login はユーザー名です。スクリプトでは、この2つをJSONから取り出します。

2. GitHubのnoreplyメールアドレスを組み立てる

取得した情報から、次の形式のメールアドレスを組み立てます。

<ID>+<USERNAME>@users.noreply.github.com

これはGitHubが利用するプライベートメールアドレスの形式の一つです。実際にGitHubアカウントに関連付けられたnoreplyアドレスと一致するかは、GitHubのメール設定で確認してください。

3. リポジトリのローカル設定を書き換える

git config --local user.name "$login"
git config --local user.email "$email"

--local は現在のリポジトリの設定を変更します。別のリポジトリや ~/.gitconfig には影響しません。

注意点

GitHubへの認証アカウントは切り替わりません。 このスクリプトが変更するのは、Gitコミットに記録される作成者名とメールアドレスだけです。git push 時に使うSSHキー、認証トークン、GitHub CLIのログイン状態は変更されません。

また、GitHubのnoreplyメールアドレスを組み立てても、それが必ずそのアカウントで有効とは限りません。 GitHubの「Settings → Emails」で実際のアドレスを確認してください。GitHubへのコミットの紐付けやメールアドレスのプライバシー設定は、アカウント側の設定にも依存します。

GitHub APIを認証なしで呼ぶため、レート制限があります。頻繁に大量実行する用途には向きません。また、ネットワーク障害や存在しないユーザー名ではエラー終了します。

なお、user.name に設定するのはGitHubの login です。プロフィールの表示名(name)を設定するわけではありません。

まとめ

GitHubのユーザー名さえ分かれば、REST APIを使って数値IDを取得し、現在のリポジトリのコミット用ユーザー情報を設定できます。

gh auth switch でアカウントを切り替える必要がなく、普段の認証状態を維持できる点が利点です。複数アカウントを扱う開発環境で、リポジトリごとの設定作業を簡略化できます。

参考: GitHub REST API — Get a user / GitHub — Setting your commit email address


この記事を編集
この記事を共有:

コメント


前の記事
LiteLLMでLLMの出力をキャッシュする方法
次の記事
CodexをBubblewrapで隔離する:エージェントAI向けの現実的なサンドボックス構成