Git,重写以前的提交用户名和电子邮件

时间:2010-05-27 09:22:54

标签: git

我已经在Github上为一个项目提交了一堆提交,但是我意识到我没有在我正在使用的计算机上设置正确的电子邮件和提交者全名,因此用户的头像和电子邮件地址不存在。

如何重写所有过去的提交电子邮件和用户名?

9 个答案:

答案 0 :(得分:166)

您可以添加此别名:

git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "

更改作者姓名:

git change-commits GIT_AUTHOR_NAME "old name" "new name"

或仅发送最近10次提交的电子邮件:

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

别名:

change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \$@; }; f "

来源:https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

答案 1 :(得分:81)

解决方案已经存在:Change the author and committer name and e-mail of multiple commits in Git

即,

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

答案 2 :(得分:28)

如果您已经将部分提交推送到公共存储库,则想要执行此操作,或者它将创建其他人可能已使用的主服务器历史记录的备用版本。 “不要越过溪流......这会很糟糕......”

也就是说,如果它只是你对本地存储库的提交,那么在你推送到服务器之前,一定要解决这个问题。您可以将git filter-branch命令与--commit-filter选项一起使用,因此它只编辑与您的错误信息匹配的提交,如下所示:

git filter-branch --commit-filter '
      if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
      then
              GIT_AUTHOR_NAME="Your Name Here (In Lights)";
              GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
              git commit-tree "$@";
      else
              git commit-tree "$@";
      fi' HEAD

答案 3 :(得分:12)

应用Olivier Verdier的答案后:

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

...在原始存储库上推送已更改的历史记录:

git push origin +yourbranch

上述命令(注意加号)也强制重写原始仓库的历史记录。请谨慎使用!

答案 4 :(得分:6)

考虑使用git-filter-branchnot desired,以便在git-filter-repo中执行相同的操作(您可能需要先使用pip install git-filter-repo安装它):

git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'

如果存储库是原始存储库,没有远程存储,则必须添加--force才能强制重写。 (在执行此操作之前,您可能需要创建存储库的备份。)

如果您不想保留引用(它们将显示在Git GUI的分支历史记录中),则必须添加--replace-refs delete-no-add

有关更多高级功能,请参见"Filtering of names & emails"

P.S。从https://stackoverflow.com/a/59591928/714907开始被盗和改进。

答案 5 :(得分:3)

对于那些只想要简单复制粘贴版本的人(除了更新电子邮件和名称):

C

答案 6 :(得分:2)

如果您主要关心本地存储库显示名称,则重写历史记录的替代方法是 .mailmap file,它基本上是名称和电子邮件列表。例如,将其放在存储库根目录的 .mailmap 文件中:

Tamika Page <tamika@somejob.com>
Orlando Cervantes <orlando.cervantes@otherjob.com> Orlando Jackson <orlando.jackson@otherjob.com>
Jared Michael <jared.michael@gmail.com> <jared@desktop.(none)>

将导致任何归因于 tamkia@somejob.com 的提交显示为名称 Tamika Page,无论提交者名称如何,归因于 Orlando Jackson <orlando.jackson@otherjob.com> 的提交显示为奥兰多塞万提斯,以及令人讨厌的 {{1} } 提交归因于 <jared@desktop.(none)>。有关完整的详细信息,请查看此功能的 git documentation - 由于它内置于 git 中,因此应该适用于任何合理的新 git 客户端。

这里有一个很大的警告:虽然官方 git 客户端已经支持了很长一段时间,但不能保证支持各种 git 实现,特别是大型 Web 界面 - 请参阅 this question,其中共识关于 GitHub 是否尊重它,褒贬不一,但似乎是负面的。不幸的是,我将 GitHubGitLab 上的快速测试存储库放在一起,但似乎都没有注意到 jared.michael@gmail.com

正如 @paradocslover's answer 中提到的,服务有自己的接口来做类似的事情,但你必须为每个服务设置它,它根本不会影响你的本地副本。因为 .mailmap 是存储库的一部分,它在本地适用于克隆您的存储库的任何人(您可以克隆上面链接的存储库以亲自查看),但似乎不会显示在我测试的网络界面中。

当然,在某些情况下,您确实希望重写历史记录,但这可能相当具有侵入性,并且带有所有标准警告,因此在某些情况下,最好使用此选项,这可能就足够了,尤其是在重写时不实用。

答案 7 :(得分:1)

https://help.github.com/articles/changing-author-info/

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"

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

这完全对我有用。 git push之后,请确保在git的Web门户上看到更新。如果提交仍未链接到我的帐户,则在提交旁边显示默认的缩略图图像,并且未反映在我的贡献时间轴图表上,请转到提交网址,并在网址末尾附加.patch,然后验证名称和电子邮件是正确的。

答案 8 :(得分:0)

已经给出的答案是完整的。但你确定,你需要这些吗?例如。我遇到了类似的问题,但这里的答案对于这种情况来说太过分了。我的情况和解决方案描述如下:

假设您有两个电子邮件 ID,no_longer_want@gmail.comwant@gmail.com。之前的提交可能是通过 no_longer_want@gmail.com 提交的,这不是您想要的电子邮件 ID。在这种情况下,一种选择是将 want@gmail.com 链接到您的 GitHub 帐户。

怎么做?

在设置页面的电子邮件部分找到添加电子邮件的选项。

enter image description here

还是迷路了?

github page 中提到的前三个步骤就足够了。

注意:

  1. Github 支持单个 github 帐户的多个电子邮件 ID。
  2. 由于您没有替换电子邮件 ID,而只是添加一个新的电子邮件 ID,因此通过这两个电子邮件 ID 提交的提交都与您的 Github 帐户相关联。
  3. 没有必要将 want@gmail.com 设置为主要电子邮件 ID。