スクリプトは、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