如何在 Git 中更改多个提交的作者和提交者姓名和电子邮件?

问题描述

这个答案使用git-filter-branch文档现在给出这个警告:

git filter-branch 有很多陷阱,可能会对预期的历史重写产生不明显的破坏(并且由于它的性能如此糟糕,因此您几乎没有时间调查此类问题)。这些安全和性能问题不能向后兼容修复,因此不建议使用它。请使用替代历史过滤工具,例如git filter-repo。如果您仍然需要使用 git filter-branch,请仔细阅读安全(和性能)以了解 filter-branch 的地雷,然后尽可能合理地避免其中列出的许多危害。

更改作者(或提交者)将需要重写所有历史记录。如果您对此感到满意并认为这是值得的,那么您应该查看git filter-branch。手册页包含几个帮助您入门的示例。另请注意,您可以使用环境变量来更改作者、提交者、日期等的名称——请参阅git 手册页的“环境变量”部分。

具体来说,您可以使用此命令修复所有错误作者姓名和电子邮件(来源:GitHub 帮助):

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
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 filter-repo,您可以先安装它并git-mailmap根据gitmailmap的格式构造一个。

Proper Name <proper@email.xx> Commit Name <commit@email.xx>

然后使用创建的邮件映射运行 filter-repo:

git filter-repo --mailmap git-mailmap

使用交互式变基

你可以做

git rebase -i -p <some HEAD before all of your bad commits>

然后在 rebase 文件中将所有错误提交标记为“编辑”。如果您还想更改第一次提交,则必须手动将其添加为 rebase 文件的第一行(遵循其他行的格式)。然后,当 git 要求您修改每个提交时,执行

 git commit --amend --author "New Author Name <email@address.com>" 

编辑或关闭打开的编辑器,然后执行

git rebase --continue

继续变基。

您可以通过追加跳过在此处完全打开编辑器,--no-edit 以便命令为:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

单次提交

正如一些评论者所指出的,如果您只想更改最近的提交,则不需要 rebase 命令。做就是了

 git commit --amend --author "New Author Name <email@address.com>"

这会将作者更改为指定的名称,但提交者将设置为您在git config user.name和中配置的用户git config user.email。如果您想将提交者设置为您指定的内容,这将同时设置作者和提交者:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

合并提交注意事项

我原来的回答有一点小瑕疵。HEAD如果在 current和 your之间有任何合并提交<some HEAD before all your bad commits>,那么git rebase会将它们展平(顺便说一下,如果您使用 GitHub 拉取请求,那么您的历史记录中将会有大量的合并提交)。这通常会导致非常不同的历史记录(因为重复的更改可能会“重新设置为基础”),并且在最坏的情况下,它可能会导致git rebase要求您解决困难的合并冲突(可能已经在合并提交中解决了) . 解决方案是使用-p标志 to git rebase,这将保留您的历史合并结构。手册页git rebase警告说使用-pand-i可能会导致问题,但在BUGS 它说“编辑提交和改写他们的提交消息应该可以正常工作”部分。

我已经添加-p到上面的命令中。对于您只是更改最近提交的情况,这不是问题。

现代 git 客户端更新(2020 年 7 月)

使用--rebase-merges代替-p(-p已弃用并且存在严重问题)。

解决方法

我正在学校计算机上编写一个简单的脚本,并将更改提交到 Git(在我的笔式驱动器中的一个存储库中,从我家的计算机克隆)。在几次提交之后,我意识到我是以 root 用户的身份提交的东西。

有没有办法将这些提交的作者更改为我的名字?

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...