【问题标题】:Git change user's credentials in past commits without changing the history (date of commits)Git 在过去的提交中更改用户的凭据而不更改历史记录(提交日期)
【发布时间】:2021-02-22 05:59:59
【问题描述】:

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

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

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

【问题讨论】:

  • 试试 git mailmap。见stackoverflow.com/questions/53629125/…。还有关于.mailmap 功能的文档,git-scm.com/docs/git-shortlog#_mapping_authors
  • 将您的其他电子邮件地址添加到您的 GitHub 个人资料。
  • @EdwardThomson 是的,我已经为最新提交添加了正确的电子邮件地址,但我的问题是针对我之前所做的提交。现在我的问题已经解决,我已经在下面发布了答案。谢谢
  • 对,我说的是您用于早期提交的电子邮件地址。您可以在 GitHub 中拥有多个电子邮件地址,这会将所有这些地址的提交与您的个人资料相关联。

标签: git github git-commit


【解决方案1】:

我们可以使用.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 立即更新远程存储库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2021-09-24
    • 2021-01-06
    • 2018-08-29
    • 1970-01-01
    • 2021-09-14
    • 2020-07-06
    相关资源
    最近更新 更多