修改 Git 提交历史中的作者信息

2024-01-18#Git

在使用了多个 Github 账号的电脑上工作时,不小心就以错误的作者信息提交到 Git仓库。

修改提交历史的方法 🔗

通过 filter-branch 修改提交历史 🔗

先创建一个别名:

git config --global 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
git change-commits GIT_COMMITTER_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

(注意:似乎以上命令并没有修改 Commit Email)

来源: https://stackoverflow.com/a/11768843

需要特别注意的是filter-branch 已经不被建议使用了,更好的方式是使用 git-filter-repo。当使用 filter-branch 时,其实已经会看到警告消息:

WARNING: git-filter-branch has a glut of gotchas generating mangled history
	 rewrites.  Hit Ctrl-C before proceeding to abort, then use an
	 alternative filtering tool such as 'git filter-repo'
	 (https://github.com/newren/git-filter-repo/) instead.  See the
	 filter-branch manual page for more details; to squelch this warning,
	 set FILTER_BRANCH_SQUELCH_WARNING=1.

使用 git-filter-repo 修改提交历史 🔗

git-filter-repo 工具只是一个 Python 文件。

参考其安装说明,下载源代码后(然后将其改为可执行文件)可直接使用,或者通过 pip 安装。它的用法可参考其 Manual Page

修改提交历史中的邮箱可用如下命令:

git-filter-repo --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'  --refs HEAD~10..HEAD --force

强制提交 🔗

修改了提交历史后,如果已经提交到远程代码仓库,那么就得强制重写远端的提交历史:

git push -f __remote__ __branch__

此时需要确保有强制重写远端的提交历史的权限。


加载中...