Change commit author in git history

If you ever need to change the author of a commit (or several) within a git repository, you can use the following script:

#!/usr/bin/env bash

usage() {
  echo "Please set the following enviroment variables:"
  echo "  OLD_EMAIL : your-old-email@example.com"
  echo "  NEW_EMAIL : your-correct-email@example.com"
  echo "  NEW_NAME  : Your Correct Name"
  echo "Then run the script again from a git repository directory."
  echo "Example: OLD_EMAIL=alice@example.com NEW_EMAIL=bob@example.com NEW_NAME=\"Bob Doe\" $0"
}

if [ ! -d .git ]; then
  echo "Current directory is not a git repository!"
  exit 1
fi

if [ -z "${OLD_EMAIL}" ] || [ -z "${NEW_EMAIL}" ] || [ -z "${NEW_NAME}" ]; then
  usage
  exit 1
fi

echo "Going to rewrite git history and changing commit authorship."

git filter-branch --env-filter '
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

echo "Finished."

Attention!

Beware that the whole history of the repository will be rewritten! This means that other users will have to rebase their changes.

Jens Grassel Written by:

Solving problems and burning chrome for fun and profit.