🌱

「GitHubの草が生えない問題への対処法」の巻

2024/02/27に公開

背景

日々の開発活動中にたくさんのコミットを重ねていたにも関わらず、GitHubの草が全然生えてなく、Commit数も増えていないことに気づいた時でした。
詳しく調べてみると、コミットが別の人物として記録されていることが判明しました。この記事では、そんな時に疑うべき原因と問題を解決する方法について解説します。
https://x.com/soma_takata/status/1761945691839238479?s=20

原因

Gitのユーザー名とメールアドレスの設定がGitHubアカウントと一致していなかったことにありました。

Githubでのユーザー名とメールアドレスの確認

  1. GitHubアカウントにサインイン: まず、GitHubにログインします。
  2. 設定ページへのアクセス: 右上にあるプロフィールアイコンをクリックし、ドロップダウンメニューから「Settings」を選択します。
  3. メールアドレスの確認: 左側のサイドバーから「Emails」を選択します。ここで、登録されているメールアドレスを確認します。
  4. ユーザー名の確認: 設定画面の上の部分に以下のように表示されており、()の中身がユーザー名

Gitでのユーザー名とメールアドレスの確認

ローカル環境でのGitのユーザー名とメールアドレスの設定を確認しましょう。これには、ターミナルで以下のコマンドを使用します。

git config --list

このコマンドによって表示されたユーザー名(user.name)とメールアドレス(user.email)が、GitHubアカウントのものと異なっている場合が問題の原因です。

user.name = あなたのユーザー名
user.email = あなたのメールアドレス

設定の修正

問題の修正には、まず正しいユーザー名とメールアドレスをGitに設定する必要があります。これは、グローバル設定または特定のリポジトリに対するローカル設定として行うことができます。

  • グローバル設定の変更:
git config --global user.name "あなたのGitHubユーザー名"
git config --global user.email "あなたのGitHubメールアドレス"
  • ローカル設定の変更:
git config --local user.name "あなたのGitHubユーザー名"
git config --local user.email "あなたのGitHubメールアドレス"

過去のコミットも反映したい時

過去に行ったコミットを自分のコミットとして反映する方法は二つあります。

  1. GitHubにメールアドレスを登録
  2. 過去のコミットの修正

方法は二つありますが、個人的に1番目をおすすめします。

1. GitHubにメールアドレスを登録

Gitの設定を変更せずに問題を解決する方法として、GitHubアカウントに複数のメールアドレスを登録する方法があります。これは、Gitの設定を変更したり、リポジトリの履歴を修正するよりも、よりシンプルかつ安全な解決策です。

追加メールアドレスの登録方法

  1. GitHubアカウントにサインイン: まず、GitHubにログインします。

  2. 設定ページへのアクセス: 右上にあるプロフィールアイコンをクリックし、ドロップダウンメニューから「Settings」を選択します。

  3. 「Emails」セクションへの移動: 左側のサイドバーから「Emails」を選択します。

  4. メールアドレスの追加: 「Add email address」セクションに移動し、Gitでのユーザー名とメールアドレスの確認で確認したGitに登録していたメールアドレスを入力して、「Add」をクリックします。

  5. メールアドレスの確認: GitHubから送信される確認メール内のリンクをクリックして、新しいメールアドレスを確認します。

これで、過去のコミットが自分の草として反映されます。

2. 過去のコミットの修正

過去のコミットを修正するには、Gitでログを変更する必要があります。

Gitの履歴を書き換えるツールとしてgit-filter-repoがあります。
https://github.com/newren/git-filter-repo

1. git-filter-repo のインストール:

インストールは以下から可能です。

macOS:

brew install git-filter-repo

Linux:

wget https://raw.githubusercontent.com/newren/git-filter-repo/main/git-filter-repo && \
chmod +x git-filter-repo && \
sudo mv git-filter-repo /usr/local/bin

Pip:

pip3 install git-filter-repo

2. マッピングファイルの作成:

書き換えるユーザー名やメールアドレスのマッピングを定義しますためのファイルを作成。
このファイルはレポジトリ内ではなくリポジトリ外に置くのが良い。

touch mailmap

3. マッピングファイルの編集:

作成したマッピングファイルを編集して、修正前の情報と修正したい内容をmailmapに記入します。
new_○○はGitHubの情報
old_○○はGitの前までの情報git log --pretty=fullで確認可能

過去のコミットログのユーザー名、メールアドレスを指定して書き換える場合

mailmap
new_name <new_email@example.com> old_name <old_email@example.com>

過去のコミットログのユーザー名、メールアドレスを指定して書き換える場合

mailmap
new_name <new_email@example.com> <old_email@example.com>

過去のコミットログのユーザー名、メールアドレスを指定して書き換える場合

mailmap
<new_email@example.com> <old_email@example.com>

4. 書き換えを実行:

これによって、コミットログのユーザー名とメールアドレスが新しいものに書き換えられる。

git filter-repo -f --mailmap <mailmapのpath>

5. 変更の確認:

以下を実行することで、変更の確認を行ってください。

git log --pretty=full

6. リモートリポジトリに反映したい場合

git filter-repoを使用すると誤ってリモートブランチに反映してしまうのを防ぐために、ローカルのレポジトリのリモートブランチの接続が切れる。

リモートブランチに反映させたい場合には接続し直してからforce pushを行います。
ただし、リポジトリを共同で作業している場合は書き換えた内容をpushして問題ないか確認をとってから実施しましょう。

git remote add origin git@github.com:"ユーザー名"/"書き換えたいリポジトリ名"
git push -f origin main

# ローカルのすべてのブランチを書き換えたい場合は--allをつける
git push -f origin --all

最後に

今回自分は、二番目の方法を行いました。
理由としてはGitに登録されていたメールアドレスを消していたため復元ができなかったからです。
コミット数でみられることはそうそうないと思いますが、念のため個人開発のリポジトリは書き換えました。
チーム開発のものは何が起こるかわからないためやめました。

最後まで見ていただきありがとうございます。

Discussion