Git 在不更改历史记录(提交日期)的情况下更改过去提交中的用户凭据

Git change user's credentials in past commits without changing the history (date of commits)

过去,我开始从事某些项目时没有在终端 git 的凭据中提供正确的 GitHub 电子邮件地址。所以每次提交都显示如下:

这些提交是在没有我的用户名的情况下进行的,因此这些提交也没有显示在贡献部分:

如图 1 所示,我已在 3 月 14 日提交,但未在贡献中显示(因为为 git 凭据设置了错误的电子邮件)。现在我所有的最新贡献都显示正确,但我也希望我过去项目的所有旧贡献都像这样显示。但我不想更改提交历史(即日期)。

我们可以使用.mailmap 来编写所有提交,但我认为这是一个有点困难的解决方案。 我发现非常有用的更简单的解决方案如下:

--> 首先,使用 git shortlog -sne 进入你的项目目录,通过他们的电子邮件检查所有用户的提交。

现在,如果您的项目只有一个用户用于提交,那么您应该试试这个:

git filter-branch -f --env-filter "
 GIT_AUTHOR_NAME='newName'
 GIT_AUTHOR_EMAIL='newEmail'
 GIT_COMMITER_NAME='newName'
 GIT_COMMITER_EMAIL='newEmail'
" HEAD

Remember: 如果您的项目有多个贡献者,它还会将其更新为您将提供的一个贡献者。

--> 对于多个贡献者,您想要更新一个或特定的贡献者。您可以尝试条件方法,例如

git filter-branch -f --env-filter "
if test "$GIT_AUTHOR_EMAIL" = 'currentWrongEmail'
then
    GIT_AUTHOR_EMAIL='newEmail'
fi
if test "$GIT_COMMITTER_EMAIL" = 'currentWrongEmail'
then
    GIT_COMMITTER_EMAIL='newEmail'
fi
" HEAD

两种情况结束时,使用git push -f立即更新远程存储库。