Git のコミット履歴のメッセージ変更

スクリプトは、git filter-branch を使用して、Git の履歴コミットの作成者情報を一括で変更するために使用されます。

提供されたスクリプトは、Git リポジトリの過去のコミットの作成者情報を一括で変更するためのもので、全体的なコンセプトは正しいですが、git filter-branch--env-filter で配列(例:OLD_EMAILS=("..."))を使用すると、互換性の問題が生じる可能性があります。なぜなら、一部のシェル環境(/bin/sh など)では配列構文がサポートされていないためです。

互換性を高めるため、配列をスペースで区切られた文字列に置き換え、forループを使用して各古いメールアドレスを反復処理することをお勧めします。以下に変更後のスクリプトの例です。

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAILS="TianlongXiang51@gmail.com nick@qq.com tianlongxiang51@gmail.com"
CORRECT_NAME="tianlong.xiang"
CORRECT_EMAIL="tianlong.xiang@foxmail.com"

for OLD_EMAIL in $OLD_EMAILS
do
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
done
' --tag-name-filter cat -- --branches --tags

注意事項:

  • スクリプトを実行する前に、予期せぬ事態を防ぐため、リポジトリのバックアップを取ることをお勧めします。

  • この操作はGitの履歴を上書きし、コミットの作成者情報を変更するため、コミットハッシュ値が変化する可能性があります。

  • 変更をリモートリポジトリにプッシュしている場合は、強制プッシュを使用する必要があります。

    git push --force --tags origin 'refs/heads/*'
    

強制プッシュは慎重に行ってください。特に複数人で共同作業しているプロジェクトでは、他者に影響を与えないように注意してください。


倉庫内の重複しない著者メールアドレスをすべて統計する。

git log --format='%an <%ae>' | sort -u
Licensed under CC BY-NC-SA 4.0
最終更新 2025年05月25日 14:10
金融ITプログラマーのいじくり回しと日常のつぶやき
Hugo で構築されています。
テーマ StackJimmy によって設計されています。