我已经为Github上的一个项目提交了一堆提交,但是我意识到我没有在我正在使用的计算机上设置正确的电子邮件和提交者全名,因此用户的头像和电子邮件地址不在那里.
如何重写所有过去的提交电子邮件和用户名?
bra*_*obo 198
您可以添加此别名:
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 "
Run Code Online (Sandbox Code Playgroud)
要更改作者姓名:
git change-commits GIT_AUTHOR_NAME "old name" "new name"
Run Code Online (Sandbox Code Playgroud)
或仅限最近10次提交的电子邮件:
git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD
Run Code Online (Sandbox Code Playgroud)
别名:
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 "
Run Code Online (Sandbox Code Playgroud)
资料来源:https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
Oli*_*ier 86
解决方案已经存在:在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
Run Code Online (Sandbox Code Playgroud)
ewa*_*all 35
如果您已经将一些提交推送到公共存储库,那么您不希望这样做,或者它将创建其他人可能已使用的主服务器历史记录的备用版本."不要越过溪流......这会很糟糕......"
也就是说,如果它只是你对本地存储库的提交,那么在你推送到服务器之前,一定要解决这个问题.您可以使用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
Run Code Online (Sandbox Code Playgroud)
Amr*_*per 17
首先更新用户名和电子邮件
在全局或当前存储库中更新它们
git config --global user.name "Name"
git config --global user.email "<name@email.com>"
Run Code Online (Sandbox Code Playgroud)
请注意,您可以在 .git/config 文件中更新它们,只需将此部分附加到您的信息即可
[user]
name = new name
email = new email
Run Code Online (Sandbox Code Playgroud)
然后运行此命令来更新所有以前的提交
git rebase -r --root --exec "git commit --amend --no-edit --reset-author"
Run Code Online (Sandbox Code Playgroud)
sar*_*sso 15
应用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
Run Code Online (Sandbox Code Playgroud)
...在原始存储库中推送已更改的历史记录:
git push origin +yourbranch
Run Code Online (Sandbox Code Playgroud)
上面的命令(注意加号)强制重写原始仓库的历史记录.谨慎使用!
8da*_*day 11
考虑到使用的git-filter-branch是没有希望的,做同样的事情在git的过滤器回购(您可能需要与第一次安装它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")'
Run Code Online (Sandbox Code Playgroud)
如果存储库是原始的,没有远程,则必须添加--force以强制重写。(您可能希望在执行此操作之前创建您的存储库的备份。)
如果您不想保留 refs(它们将显示在 Git GUI 的分支历史记录中),则必须添加--replace-refs delete-no-add.
有关更多高级功能,请参阅“姓名和电子邮件过滤”。
PS 被盗并从/sf/answers/4171434991/改进。
对于那些只想要简单复制粘贴版本的人(除了更新电子邮件和姓名):
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>" -f
git change-commits GIT_AUTHOR_EMAIL <old@email.com> <new@email.com> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <old@email.com> <new@email.com> -f
Run Code Online (Sandbox Code Playgroud)
已经给出的答案是完整的。但你确定你需要这些吗?例如。我面临着类似的问题,但这里的答案对于这种情况来说太过分了。我的案例和解决方案描述如下:
假设您有两个电子邮件 ID,no_longer_want@gmail.com并且want@gmail.com. 之前的提交可能no_longer_want@gmail.com不是您想要的电子邮件 ID。在这种情况下,一种选择是简单地链接want@gmail.com到您的 GitHub 帐户。
在设置页面的电子邮件部分中找到添加电子邮件的选项。
github 页面上提到的前三个步骤就足够了。
want@gmail.com将其设置为主要电子邮件 ID。小智 5
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
Run Code Online (Sandbox Code Playgroud)
这完全对我有用。git push之后,请确保在git的Web门户上看到更新。如果提交仍未链接到我的帐户,则在提交旁边显示默认的缩略图图像,并且未反映在我的贡献时间轴图表上,请转到提交网址并在网址末尾附加.patch,然后验证名称和电子邮件是正确的。
如果您主要关心本地存储库显示名称,则重写历史记录的另一种方法是.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)>
Run Code Online (Sandbox Code Playgroud)
将导致任何归因于tamkia@somejob.com显示为名称 Tamika Page 的提交(无论提交者名称如何)、归因于Orlando Jackson <orlando.jackson@otherjob.com>显示为 Orlando Cervantes 的提交以及<jared@desktop.(none)>归因于 的讨厌的提交jared.michael@gmail.com。有关完整详细信息,请查看此功能的git 文档- 因为它内置于 git 中,所以它应该适用于任何相当新的 git 客户端。
不过这里有一个很大的警告:虽然它在官方 git 客户端中已经得到支持很长一段时间了,但并不能保证对各种 git 实现(特别是大型 Web 接口)的支持 - 请参阅这个问题,其中关于GitHub是否尊重它的共识混合但似乎消极。不幸的是,我在GitHub和GitLab上整理了快速测试存储库,但似乎都没有注意到.mailmap。
正如@paradocslover 的回答中提到的,这些服务有自己的接口来执行类似的操作,但您必须为每个服务进行设置,并且它根本不会影响您的本地副本。因为.mailmap它是存储库的一部分,所以它可以在本地为任何克隆你的存储库的人工作(你可以克隆上面链接的存储库来亲自查看),但它似乎不会显示在我测试的网络界面中。
当然,在某些情况下,您确实想要重写历史记录,但这可能相当具有侵入性,并且带有所有标准警告,因此对于某些情况,最好有这个选项,这可能就足够了,特别是如果重写不是实际的。
| 归档时间: |
|
| 查看次数: |
49562 次 |
| 最近记录: |