我可以在以前的所有提交中更改我的名字和姓氏吗?

我想改变我的名字,姓氏和电子邮件在我的所有提交,这是可能的吗?

43967 次浏览

除非你没有对世界做出承诺。否则,每个人都有你的旧名字在他们的回购,这是不可能的,你可以改变每个人的。

Use git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
fi; git commit-tree "$@"'

这只影响作者,而不影响提交者(对于大多数提交,提交者与作者相同)。如果您也想重写这些变量,请设置 GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL变量。

The 标准警告 about rewriting history applies; only do it to history that has not yet been shared.

2018年6月最新情况

该手册现在包括一个解决方案,使用 --env-filter,在其例子: https://git-scm.com/docs/git-filter-branch#_examples:

git filter-branch --env-filter '
if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
then
GIT_AUTHOR_EMAIL=john@example.com
fi
if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
then
GIT_COMMITTER_EMAIL=john@example.com
fi
' -- --all

如果没有其他作者,你可以这样做:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

在所有选定的提交中重写 author 和 miter:

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

将下面的脚本保存为例如 ~/.bin/git-replace-author,并使用以下方法运行它,例如:

git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"

没有参数,它根据 Git 配置更新所有提交的名称,以使用当前的电子邮件地址。

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"


echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"


git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
export GIT_AUTHOR_NAME="${NEW_NAME}"
export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
export GIT_COMMITTER_NAME="${NEW_NAME}"
export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

Raw (下载)

与 Git 2.24(Q42019) ,不推荐使用 git filter-branch(和 BFG)

The equivalent would be, using newren/git-filter-repo, and its 例子部分:

cd repo
git filter-repo --mailmap my-mailmap

my-mailmap合作:

Correct Name <correct@email.com> <old@email.com>

这将替换任何人用 <old@email.com>完成的任何提交的作者姓名和电子邮件

请参阅 git shortlog映射作者部分了解