Summary
I rewrote the history of one of my Git repositories for security reason last year.
This post is about how I did, referring to the official documentation.
Besides, if it had been a public repository shared with or used by several people, I should have considered more about how to do, especially in communication.
Description
The primary command is below. Well, <*-username> and <*-user@e.mail> are due to environment.
# bash
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" != "<old-username>" ] || [ "$GIT_AUTHOR_EMAIL" != "<old-user@e.mail>" ];
then
GIT_AUTHOR_NAME="<new-username>";
GIT_AUTHOR_EMAIL="<new-user@e.mail>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
It is Git's filter-branch action, a module to "rewrite branches", with --commit-filter <command> filter "for performing the commit", targeting HEAD.
It detects history lines whose username or email isn't valid and rewrites them. Well, of course, you can change the if condition and so on in it.
Then I pushed the rewritten history to hosting service (which was Gitea) I used.
$ git push --force origin main
Here, --force or -f option is necessary for the original lines not to be duplicated. Besides, If they were duplicated unfortunately, you might have to run git reset --hard HEAD^ and then git push --force origin HEAD in order to delete all of the duplicated by restoring the previous commit.
Top comments (2)
I haven't tried, but I think there is a problem in the example code:
should be:
Hello, Pierre,
Thank you for your comments and recommendation.
The condition is up to the situation.
I guess I perhaps had to fix all except the pair "old username" - "old email". (It has
elseclause.)Well, actually, I forgot what it was more than a year ago. Ha ha.
When convevting the old set to the new one, you are right.