-
-
Save octocat/0831f3fbd83ac4d46451 to your computer and use it in GitHub Desktop.
Line three
git filter-branch --env-filter '
should be changed to
git filter-branch --env-filter $'
to escape '
it in the case that CORRECT_NAME
should contain an apostrophe.
What if we have multiple old emails? This though might be useful:
#!/bin/sh
# see https://help.github.com/articles/changing-author-info/
git filter-branch --env-filter '
OLD_EMAIL=(
"[email protected]"
"[email protected]"
)
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
for NEW_EMAIL in ${OLD_EMAIL[@]}; do
if [ "$GIT_COMMITTER_EMAIL" == "$NEW_EMAIL" ]; then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" == "$NEW_EMAIL" ]; then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
done
' --tag-name-filter cat -- --branches --tags
@shivapoudel good enhancement 👍
It could be done a case insensitive OLD_EMAIL search too (see my fork)
@gchicareli Don't work for me I have this
It worked as it is for me but I had to checkout every branch manually and run it.
I've moved one of my personal script related to this and made a command for it in https://github.com/tj/git-extras/
See https://github.com/tj/git-extras/blob/master/man/git-reauthor.md
In case you also want to change commits with a specific author name:
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
OLD_NAME="You Old Name"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_NAME" = "$OLD_NAME" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_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
My fork: https://gist.github.com/frz-dev/adf8c2c7275da1369e0cc340feda0ba0
@frz-dev Awesome! Thanks
On mac when I added quotes around my OLD_EMAIL, etc. in quotes some extra characters got added in my name (escape chars?). Then I had to make my OLD_EMAIL as my CORRECT_EMAIL with quotes and add CORRECT_NAME and CORRECT_EMAIL without quotes. This resolved everything and linked my commits properly.
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 [email protected] your-name [email protected]
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.
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
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Gerson Chicareli"
CORRECT_EMAIL="[email protected]"
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