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

推荐订阅源

Cloudbric
Cloudbric
有赞技术团队
有赞技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Threat Research - Cisco Blogs
L
LangChain Blog
Simon Willison's Weblog
Simon Willison's Weblog
Project Zero
Project Zero
Latest news
Latest news
S
Schneier on Security
Cisco Talos Blog
Cisco Talos Blog
MyScale Blog
MyScale Blog
C
Check Point Blog
IT之家
IT之家
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
G
Google Developers Blog
T
Tor Project blog
T
Threatpost
D
DataBreaches.Net
博客园 - 【当耐特】
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Troy Hunt's Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
NISL@THU
NISL@THU
P
Privacy & Cybersecurity Law Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
博客园_首页
S
Securelist
T
The Exploit Database - CXSecurity.com
Last Week in AI
Last Week in AI
量子位
U
Unit 42
Know Your Adversary
Know Your Adversary
Hugging Face - Blog
Hugging Face - Blog
S
Security Affairs
Google Online Security Blog
Google Online Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
N
News and Events Feed by Topic
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志

光溯星河

【实践记录】重新部署 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 协议,完整转载请注明来自 光溯星河