Skip to content

Instantly share code, notes, and snippets.

@octocat
Last active November 21, 2023 02:36
Show Gist options
  • Save octocat/0831f3fbd83ac4d46451 to your computer and use it in GitHub Desktop.
Save octocat/0831f3fbd83ac4d46451 to your computer and use it in GitHub Desktop.
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
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
' --tag-name-filter cat -- --branches --tags
@Avinash-Bhat
Copy link

Avinash-Bhat commented Aug 17, 2017

This is my stab at making this script a bit more usable:

TL;DR?

the following changes makes it possible to use the script like this:

> git rewrite-author your-old-email@example.com your-name your-new-email@example.com

changes to ~/.gitconfig

[alias]
    ...
    rewrite-author = !/<path-to-script>/git-rewrite-author.sh

Note: Change the <path-to-script> with the actual path of the script

changed script (git-rewrite-author.sh)

#!/bin/sh

OLD_EMAIL=$1
CORRECT_NAME=$2
CORRECT_EMAIL=$3
shift 3
if [ -z "$OLD_EMAIL" ]; then
	echo "old email is missing"
	exit 1
fi
if [ -z "$CORRECT_NAME" ]; then
	echo "correct name is missing"
	exit 2
fi
if [ -z "$CORRECT_EMAIL" ]; then
	echo "correct email is missing"
	exit 3
fi
echo "re-writing history of '${OLD_EMAIL}' to '${CORRECT_NAME}'(${CORRECT_EMAIL})"
git filter-branch --env-filter "
	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
	" $@ --tag-name-filter cat -- --branches --tags

PS: if you need to force the change (because git usually stores the original refs under refs/original/), use -f to force rewrite.

@fed-franz
Copy link

I also wrote a convenient script to easily rewrite author/committer name and/or email.
You can find it here:
https://github.com/frz-dev/utilities/blob/master/git/git-author-rewrite.sh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment