You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的映射文件,写入替换规则,格式如下:
    A的姓名 <A的邮箱> C的姓名 <C的邮箱>
    
    如果用户C有多个使用过的姓名/邮箱,按上述格式新增多行规则即可。
  • 执行历史重写操作
    git filter-repo --mailmap mailmap
    
    操作完成后所有用户C的提交都会归属到A名下,提交内容、时间线完全保留。

方法二:使用原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:15:02