gitの過去コミットの情報(email,name,date)を改変する
2023/08/19 22:30:00
以下の手順で、git の過去コミットのemailをすべて指定したものに変更できる
※ filter-branch を実施すると内部的にはバックアップが作成されているらしい
※ filter-branch の -f オプションはバックアップを上書きすると意味
※ 要するに危険な行為なので実施する場合は、十分注意する必要があるということ
email を書き換える #
$ git filter-branch -f --env-filter 'GIT_AUTHOR_EMAIL="変更後email"; GIT_COMMITTER_EMAIL="変更前email";' -- --all
WARNING: git-filter-branch has a glut of gotchas generating mangled history
rewrites. Hit Ctrl-C before proceeding to abort, then use an
alternative filtering tool such as 'git filter-repo'
(https://github.com/newren/git-filter-repo/) instead. See the
filter-branch manual page for more details; to squelch this warning,
set FILTER_BRANCH_SQUELCH_WARNING=1.
Proceeding with filter-branch...
# 上記の通り、警告がでるので filter-repo を使ったほうがいいかもしれないが、python と連携必要そう...
# とりあえずメモとして残しておく(利用実績なし)
$ git filter-repo --email-callback 'return email.replace(b"変更前email", b"変更後email")'
name を書き換える #
$ git filter-branch -f --env-filter 'GIT_AUTHOR_NAME="変更後name"; GIT_COMMITTER_NAME="変更前name";' -- --all
# 同じく以下のほうがいいかも。
# とりあえずメモとして残しておく(利用実績なし)
$ git filter-repo --name-callback 'return name.replace(b"変更前name", b"変更後name")'
date を書き換える #
ここでは実行した日時を設定する
# for bash
$ DT=$(date -R); git filter-branch -f --env-filter 'GIT_AUTHOR_DATE="${DT}"; GIT_COMMITTER_DATE="${DT}";' -- --all
# for fish
$ set -x DT (date -R)
$ git filter-branch -f --env-filter 'GIT_AUTHOR_DATE="$DT"; GIT_COMMITTER_DATE="$DT";' -- --all
時間フォーマットは以下の通り。
$ date -R
Wed, 08 Nov 2023 20:00:00 +0900
なので DT を好きな内容に変更すればいつでも思った時間に改変できる
# for bash
$ DT="Wed, 08 Nov 2023 21:00:00 +0900"; git filter-branch -f --env-filter 'GIT_AUTHOR_DATE="${DT}"; GIT_COMMITTER_DATE="${DT}";' -- --all
# for fish
$ set -x DT "Wed, 08 Nov 2023 21:00:00 +0900"
$ git filter-branch -f --env-filter 'GIT_AUTHOR_DATE="$DT"; GIT_COMMITTER_DATE="$DT";' -- --all
リモートリポジトリに反映させる #
$ git push --force origin [ブランチ名]