rcmdnk's blog

Amazon | git commit murder (English Edition) [Kindle edition] by Michael Warren Lucas | Mystery | Kindleストア

Gitのコミットを後から変えるのは出来るだけ避けるべきですが、 新しい環境で.gitconfigなどでユーザー名とかをきちんと設定してなかったり メールアドレスが変わったりしてどうしても変更した方が良い時もあります。

そんな時にAuthorやCommitterの情報を変更したい時の話。

Sponsored Links

Gitで過去のコミットのAuthorやCommitterを修正するスクリプト

以下を参照。

version control - Change the author and committer name and e-mail of multiple commits in Git - Stack Overflow

下のスクリプトでは 過去のcommitの中に AuthorかCommitterに訂正したい名前やメールアドレスがあった時に 名前とアドレスを適当なものに変更しています。

fix_git_commit.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env bash

FIX_NAME="fix"
FIX_EMAIL="[email protected]"
CORRECT_NAME="correct"
CORRECT_EMAIL="[email protected]"

if ! git log --pretty=format:"%an %ae %cn %cn"|grep -q -e "$FIX_NAME" -e "$FIX_EMAIL";then
  exit
fi

git filter-branch -f --env-filter "
if [ \"\$GIT_AUTHOR_NAME\" = \"$FIX_NAME\" ] || [ \"\$GIT_AUTHOR_EMAIL\" = \"$FIX_EMAIL\" ];then
    export GIT_AUTHOR_NAME=\"$CORRECT_NAME\"
    export GIT_AUTHOR_EMAIL=\"$CORRECT_EMAIL\"
fi
if [ \"\$GIT_COMMITTER_NAME\" = \"$FIX_NAME\" ] || [ \"\$GIT_COMMITTER_EMAIL\" = \"$FIX_EMAIL\" ];then
    export GIT_COMMITTER_NAME=\"$CORRECT_NAME\"
    export GIT_COMMITTER_EMAIL=\"$CORRECT_EMAIL\"
fi
" --tag-name-filter cat -- --branches --tags

最初にcommitの中に該当の文字列があるかどうかチェックしています。 %anはAuthorの名前、%aeがメールアドレス、 %cnがCommitterの名前、%ceがメールアドレス。

git filter-branchで上の様な変更を2回以上しようとすると

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

みたいなエラーがでるので-fが必要です。

リモートにpushする時は

$ git push -f

で。

他の場所で既にcloneしてある時、そのままpullすると

fatal: refusing to merge unrelated histories

というエラーが出ます。

$ git pull --allow-unrelated-histories

とするとこのエラーを無視してmergeすることが出来ますが、 その際履歴が再び残ってしまう様な形になってしまうので 上の様な変更を行う際は他での変更は全てリモートに送った上で 一箇所で変更して、すべての場所でリモートにあるものをcloneしなおして使うようにするしかないかな、と。

Sponsored Links
Sponsored Links

« GitHubのレポジトリ一覧を取ってくるワンライナー Firefox 56でVimperatorのStyleの問題をとりあえず何とかする方法 »