Skip to content

Instantly share code, notes, and snippets.

@amalmurali47
Last active May 5, 2024 19:50
Show Gist options
  • Star 31 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save amalmurali47/77e8dc1f27c791729518701d2dec3680 to your computer and use it in GitHub Desktop.
Save amalmurali47/77e8dc1f27c791729518701d2dec3680 to your computer and use it in GitHub Desktop.
Change ownership of selected older commits in Git
  1. Clone the repo.
  2. Use git rebase -i --root
  3. vim will open. Select the commits you want to modify by changing pick to edit. If you would like to change all the commits, perform the following replace: :%s/^pick/edit/g. This command changes all instances of "pick" at the start of lines to "edit".
  4. You will now be shown all the selected commits one by one. Each commit message will be displayed. You have two options:
    • If you would like to keep the commit author details the same, do a git rebase --continue.
    • If you would like to change it to a different name/email, do git commit --amend --reset-author. If --reset-author is specified, it will use the details from your git config. (If you need to specify an alternate name/email, you can do so with --author="John Doe <john@example.com>". If you would like to change the time to a previous date, you can do so with --date "2 days ago".)
  5. Do the same for all the commits and finish the rebase.
  6. Perform git push -f origin master to force push all the changes to upstream, and verify everything is correct.
  7. Now the commit history would say "X authored, Y commited" for all the commits you did not modify. To fix this, run the following git-filter command:
git filter-branch --env-filter '
OLD_EMAIL="old@email.com"
OLD_NAME="oldusername"
NEW_EMAIL="newemail@example.com"

# If the committer is updated but author isn't, set them both to author's name/email
if [ "$GIT_COMMITTER_EMAIL" = "$CORRECT_EMAIL" ] && [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$OLD_NAME"
    export GIT_COMMITTER_EMAIL="$OLD_EMAIL"
    export GIT_AUTHOR_NAME="$OLD_NAME"
    export GIT_AUTHOR_EMAIL="$OLD_EMAIL"    
fi
  1. Now the "X authored, Y commited" problem will be fixed. However, this will also update the dates again. To fix that, run the following:
git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' -f
  1. Finally, force-push again: git push -f origin master 🎉
@ashish-ad
Copy link

Very useful!
Keep up the good work!

@hafizMDM
Copy link

hafizMDM commented Feb 16, 2024

@amalmurali47 Does this change the commit's SHA1?

@amalmurali47
Copy link
Author

@hafizMDM Yes, changing the authorship or any other details of a commit will indeed change its SHA-1 hash. This is because the hash is based on the commit's content, including author info.

@CrazyFranck23
Copy link

Thanks for the hint !!

@AdityaPurswani
Copy link

:1,Ns/pick/edit/g gives no range allowed error

@amalmurali47
Copy link
Author

@AdityaPurswani, I've updated the third step with better instructions.

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