如何在Git迁移仓库时移除指定用户名并保留对应commit记录
Git仓库迁移并修改指定用户提交归属的实现方案
前置准备
提前确认三类信息:
- 待移除用户C的提交姓名、邮箱
- 目标归属用户(以A为例)的提交姓名、邮箱
- 原仓库地址、新空仓库地址
方法一:使用git filter-repo(官方推荐,效率更高)
git filter-repo是Git官方推荐的历史重写工具,操作更简单,无需手写复杂脚本,需提前安装(Windows可通过Git for Windows自带的包管理器安装,Ubuntu执行apt install git-filter-repo,Mac执行brew install git-filter-repo)。
操作步骤:
- 克隆原仓库的裸版本(避免工作区文件干扰)
git clone --bare 原仓库地址.git cd 仓库名.git - 新建名为
mailmap的映射文件,写入替换规则,格式如下:
如果用户C有多个使用过的姓名/邮箱,按上述格式新增多行规则即可。A的姓名 <A的邮箱> C的姓名 <C的邮箱> - 执行历史重写操作
操作完成后所有用户C的提交都会归属到A名下,提交内容、时间线完全保留。git filter-repo --mailmap mailmap
方法二:使用原生git filter-branch(无需额外安装)
如果不想安装额外工具,可以使用Git原生自带的filter-branch命令,执行如下脚本即可,替换脚本内的对应变量为你的实际信息:
git filter-branch -f --env-filter ' # 替换为用户C的信息 OLD_NAME="C的姓名" OLD_EMAIL="c@example.com" # 替换为目标归属用户A的信息 NEW_NAME="A的姓名" NEW_EMAIL="a@example.com" # 修改提交者信息 if [ "$GIT_COMMITTER_NAME" = "$OLD_NAME" ] || [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$NEW_NAME" export GIT_COMMITTER_EMAIL="$NEW_EMAIL" fi # 修改作者信息 if [ "$GIT_AUTHOR_NAME" = "$OLD_NAME" ] || [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$NEW_NAME" export GIT_AUTHOR_EMAIL="$NEW_EMAIL" fi ' --tag-name-filter cat -- --all
该命令会遍历所有分支、标签的全部提交,匹配用户C的信息后批量替换为A的信息。
推送到新仓库
操作完成后先执行git log核对提交者信息无误后,执行以下命令推送到新仓库:
- 绑定新仓库远程地址
git remote add new-origin 新仓库地址.git - 推送所有分支
git push new-origin --all - 推送所有标签
git push new-origin --tags
注意事项
- 操作前建议备份原仓库,避免误操作丢失数据
- 重写历史后所有提交哈希会发生变化,原仓库的本地克隆不要直接向新仓库推送
- 如果需要将用户C的提交部分归属A、部分归属B,可以先导出C的提交列表,分批次执行替换规则即可。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

