gitの過去コミットの情報(email,name,date)を改変する

gitの過去コミットの情報(email,name,date)を改変する

2023/08/19 22:30:00
Program
Git

以下の手順で、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 [ブランチ名]