How to change commit author for multiple commits using filter branch?
Asked Answered
git
S

1

14

I am using this script found at this link to edit author info across all commits.

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="[email protected]"
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_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

However, I am getting the following error(warning?):

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

I checked the log too. The author info didn't change. What am I doing wrong here?

Update: As mentioned by @elpiekay, the -f flag made the script work.

But can anyone explain the error log itself? Why does it mention about backup ? I never made any backup before (unsure what backup is being referred in the error log)

Safire answered 7/10, 2019 at 3:34 Comment(4)
Did you try -f as the error log suggested?Bard
@ElpieKay, I tried it now and it worksSafire
Every time you run git filter-branch successfully, one or more refs are rewritten and backups are created for each of them. When you run it again, the backups will be overwritten, which means the previous backups will seem lost. Although it's still possible to find them back, it's just troublesome. The command fails unless the user specifically uses -f to instruct it to overwrite the previous backups.Bard
@ElpieKay, ohk , I checked my reflog and it had an entry of filter-branch before executing this script, so that's where the previous backup came from, thanks for clearing it up, you might as well answer the question :)Safire
H
40

Actually, a better practice is to:

You can instead used right now its possible successor: newren/git-filter-repo (in Python), and its example section:

cd repo
git filter-repo --mailmap my-mailmap

with my-mailmap:

Correct Name <[email protected]> <[email protected]>

That would replace the author name and email of any commit done by anyone with <[email protected]>

See documentation on gitmailmap for the exact syntax of that mapping file.

Hogwash answered 7/10, 2019 at 4:51 Comment(2)
Thanks for the answer, I would like to give some background on the repository, I have actually exported a unity project from cloud so the reflog on the exported repo indicated two operations: clone(from their cloud storage) and filter-branchSafire
@SaurabhPBhandari Those are two legitimate steps, except the new tool (git filter-repo) replacing git filter-branch would perform the filtering much more efficiently.Hogwash

© 2022 - 2024 — McMap. All rights reserved.