如何在GitHub上将错误用户提交迁移至正确用户且保留他人贡献?
当然可以做到!不用删.git目录也不用从头来过,咱们用git filter-repo(现在官方推荐替代老旧git filter-branch的工具)就能精准把WRONG_USER的提交替换成RIGHT_USER,同时完整保留其他贡献者的记录。下面是一步步的操作指南:
1. 先给仓库做个备份(重中之重!)
操作前一定要备份整个仓库,避免操作失误丢数据。你可以直接复制整个仓库文件夹,或者用镜像克隆的方式备份:
git clone --mirror https://github.com/你的用户名/你的仓库名.git 仓库名-backup.git
2. 安装git filter-repo
如果你的Git版本是2.22.0及以上,可能已经自带了这个工具;如果没有,根据你的系统安装:
- Linux:用包管理器,比如Debian/Ubuntu系的
sudo apt install git-filter-repo,Fedora系的sudo dnf install git-filter-repo - macOS:通过Homebrew安装,
brew install git-filter-repo - Windows:用Chocolatey安装,
choco install git-filter-repo,或者直接下载官方脚本放到Git的bin目录
3. 创建用户映射文件
在仓库根目录新建一个名为mailmap.txt的文件,按以下格式填写:
RIGHT_USER <right_user@example.com> WRONG_USER <wrong_user@example.com>
把RIGHT_USER和<right_user@example.com>换成你的正确用户名和邮箱;WRONG_USER和<wrong_user@example.com>替换成错误的用户名和邮箱。如果错误用户有多个关联邮箱,每一行对应一个映射即可。
4. 执行提交历史修改
在仓库根目录运行以下命令,用映射文件替换错误用户的提交信息:
git filter-repo --mailmap mailmap.txt
这个命令会遍历所有提交,只把属于WRONG_USER的提交作者信息替换成RIGHT_USER,其他贡献者的提交会原封不动保留。
5. 验证修改结果
运行以下命令查看所有提交的作者列表,确认WRONG_USER已经消失,RIGHT_USER和其他贡献者都正常显示:
git log --format="%an <%ae>" | sort -u
也可以直接用git log查看具体提交记录,检查原WRONG_USER的提交是否已经变成RIGHT_USER。
6. 强制推送到GitHub
因为我们修改了提交历史,普通推送会被拒绝,需要用--force-with-lease强制推送(这个参数比--force更安全,能避免覆盖别人在你操作期间新提交的内容):
git push --force-with-lease origin main
如果你的主分支是master,就把main换成master;如果有其他分支需要修改,也要对这些分支执行同样的推送命令。
7. 通知协作者同步
仓库历史改变后,其他协作者不能再用原来的本地仓库继续工作了,他们需要:
- 要么重新克隆仓库:
git clone https://github.com/你的用户名/你的仓库名.git - 要么在现有仓库里执行:
如果有冲突,需要手动解决冲突后继续完成rebase。git fetch origin git rebase origin/main # 替换成你的主分支名
- 如果仓库有标签、子模块或者其他特殊设置,可能需要给
git filter-repo加额外参数,比如--tags来同步标签的作者信息。 - 如果你之前用
WRONG_USER做过GPG签名提交,修改后这些提交的签名会失效,不过作为仓库实际所有者,重新签名或者忽略都不影响仓库内容。
内容的提问来源于stack exchange,提问作者cbll

