惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
GRAHAM CLULEY
V
V2EX
WordPress大学
WordPress大学
博客园 - Franky
Last Week in AI
Last Week in AI
博客园 - 司徒正美
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
V
Visual Studio Blog
C
CERT Recently Published Vulnerability Notes
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
Attack and Defense Labs
Attack and Defense Labs
腾讯CDC
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
A
Arctic Wolf
量子位
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
雷峰网
雷峰网
博客园_首页
Google Online Security Blog
Google Online Security Blog
Spread Privacy
Spread Privacy
罗磊的独立博客
H
Hacker News: Front Page
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
TaoSecurity Blog
TaoSecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
IT之家
IT之家
The Cloudflare Blog
爱范儿
爱范儿
博客园 - 叶小钗
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell

光溯星河

【实践记录】重新部署 Tailscale DERP 并解决阿里云环境下HTTP reset问题 认知常新:工作一年之后对 AI 时代计算机行业的再思考 【辞旧迎新·2026丙午马年】春信策马,万事尽欢 【实践记录】N+1 查询问题:从一次跨地域接口超时说起 没有理由不记下这样一个可爱的日子 我曾以为只要我躲得够好,那些悲伤和艰苦就追不上我 关于时间的困惑 思源笔记API-MCP知识库方案 【实践记录】快速构建一套好用的zsh环境 【MySQL】一次SQL空格引发的“灵异事件”的排查解决 今天的晚风有了秋天的味道 博客数据库从 MySQL 迁移至 PostgreSQL 后资源占用变化报告 【博客维护】博客迁移与可能的访问异常问题说明 数据库拆分策略:分区与分库分表的实现与应用场景对比 图像工具箱服务"Markr" Beta上线(持续迭代中) 【杂文·随笔】业余摄影:拍点什么好呢 【技术思辨】从空想走向实践:一场关于“架构设计”的认知碰撞 关于成长,我有一些话要说 理解RESTful API和gRPC:原理、技术、风格及应用对比
【实践手记】Git重写已提交代码历史信息
标签 · 2025-07-04 · via 光溯星河

本文最后更新于 2025-07-04,最新编辑已超过90天,注意内容时效性。

需求背景:项目与常用git配置信息(全局)不一致,应在git仓库中进行非全局配置,但已有三四次提交推送到了远程仓库中。需要修改Git项目中已提交代码的作者信息,包括本地未推送的提交和已推送到远程仓库的历史记录。


⚠注意

本文所描述的情形并非一般生产环境常用的方法,此方法对代码仓库存在危害,非特殊需求不要采取这样的操作。

  • 此操作会重写Git历史记录,所有提交的SHA值都会改变
  • 需要强制推送到远程仓库
  • 仅在小团队、个人项目项目早期中使用
  • 如有其他协作者,应确保团队成员了解此变更
  • 准备回滚方案

⚠Git官方文档的警告

git filter-branch 存在大量隐患,可能会对预期的历史重写产生不明显的误差(而且由于其性能糟糕,你几乎没有时间去研究这些问题)。 这些安全和性能问题无法向后兼容修复,因此不建议使用。 请使用其他历史过滤工具,如 git filter-repo。 如果您仍然需要使用 git filter-branch,请仔细阅读 安全性(和 性能)以了解 filter-branch 的隐患,然后尽可能合理地避免其中列出的危险。


操作步骤

1. 检查当前配置

# 查看当前项目的git配置
git config --list --local

# 查看当前提交历史和作者信息
git log --pretty=format:"%h %an <%ae> %s" -5

2. 配置新的作者信息(仅对当前项目)

# 设置新的用户名和邮箱(仅对当前项目生效)
git config user.name "新用户名"
git config user.email "新邮箱@example.com"

# 验证配置
git config --list --local | grep user

3. 修改历史记录中的作者信息

# 使用git filter-branch批量修改所有提交的作者信息
git filter-branch --env-filter '
OLD_EMAIL="旧邮箱@example.com"
CORRECT_NAME="新用户名"
CORRECT_EMAIL="新邮箱@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

4. 验证修改结果

# 检查修改后的提交记录
git log --pretty=format:"%h %an <%ae> %s" -5

# 查看最近几次提交
git log --oneline -3

5. 推送到远程仓库

# 使用强制推送更新远程仓库(建议使用--force-with-lease更安全)
git push --force-with-lease origin main

# 或者使用普通强制推送(风险更高)
git push --force origin main

6. 清理临时文件

# 删除git filter-branch产生的临时文件
rm -rf .git/refs/original/

# Windows PowerShell版本
Remove-Item -Recurse -Force .git/refs/original/ -ErrorAction SilentlyContinue

变更验证

本地验证:

# 查看提交历史
git log --oneline -10

# 查看作者信息
git log --pretty=format:"%h %an <%ae> %s" -10

# 检查当前配置
git config user.name
git config user.email

远程验证:检查远程仓库的作者信息是否正确更新

其它方案

如果需求变更并没有上面描述的常见特殊,可以采用下面更安全的替代方案。

仅修改最后一次提交

bash git commit --amend --author="新用户名 <新邮箱@example.com>"

使用git filter-repo(推荐)

现代替代方案,比filter-branch更安全:

# 手动安装git filter-repo
pip install git-filter-repo

# 修改作者信息
git filter-repo --mailmap mailmap.txt

mailmap.txt文件格式:

新用户名 <新邮箱@example.com> <旧邮箱@example.com>

参考阅读

光溯星河

博学笃志,切问近思

本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 光溯星河