告别臃肿!使用 git-filter-repo 优雅清理 Git 历史记录

告别臃肿!使用 git-filter-repo 优雅清理 Git 历史记录

痛点:为什么我们的 .git 文件夹越来越大?

在日常开发中,你是否遇到过这样的情况:项目代码本身没多少,但执行 git clone 时却要下载几个 G 的数据?或者偶尔手抖,把包含密码的配置文件、测试用的 .mp4 视频、甚至是庞大的 .node_modules 目录提交到了 Git 中。

即便你随后立刻执行了 git rm 删除了这些文件,并在最新的 commit 中修复了问题,Git 的核心机制依然会忠实地在历史树中永久保留它们。这些“历史遗留物”会持续占用磁盘空间,拖慢拉取代码的速度。

为了彻底将它们从历史记录中抹除,我们需要重写 Git 历史。

过去,我们常使用 git filter-branchBFG Repo-Cleaner。但今天,我要向大家强烈推荐 Git 官方推荐的替代工具:git-filter-repo。它不仅速度极快,而且功能强大、语法简洁。


神器登场:什么是 git-filter-repo?

git-filter-repo 是一个用于重写 Git 历史记录的通用工具。根据 Git 官方文档的建议,由于 git filter-branch 存在性能和安全性问题,git-filter-repo 已经成为了执行此类任务的首选标准。

1. 安装指南

安装过程非常简单。由于它是基于 Python 编写的,最推荐的安装方式是使用 pip

# 确保你的系统中已安装 Python 3 pip install git-filter-repo 

如果你是 macOS 用户,也可以直接使用 Homebrew:

brew install git-filter-repo 

实战演练:常见场景清理指南

⚠️ 终极警告: 重写历史会改变所有受影响 commit 的 Hash 值。在进行以下任何操作前,请务必备份你的项目,或者在一个全新的 clone 目录中进行测试!

场景一:批量删除特定后缀的媒体文件(如 .png 和 .mp4)

这也是我在实际开发中最常遇到的情况。假设我们需要把项目中所有历史提交里的图片和视频彻底清理掉,只需在项目根目录执行:

git filter-repo --path-glob '*.png' --path-glob '*.mp4' --invert-paths --force 

参数解析:

  • --path-glob: 用于指定匹配模式。
  • --invert-paths: 这是一个非常巧妙的参数,它告诉工具:保留除了匹配路径之外的所有文件。换句话说,就是删除匹配到的文件。
  • --force: 如果你不是在一个 fresh clone(全新克隆)的裸仓库(bare repo)中操作,工具会出于安全考虑阻止你,加上此参数可强制执行。

场景二:删除特定的敏感目录或文件

如果有人不小心把 config/database.yml(包含线上数据库密码)提交了,你可以这样抹除它:

git filter-repo --path config/database.yml --invert-paths --force 

删除整个文件夹(比如不小心提交的 dist 编译产物):

git filter-repo --path dist/ --invert-paths --force 

场景三:将某个子目录提取为独立的新仓库

有时候我们需要把一个巨型单体仓库中的某个模块(如 src/utils/)单独拆分出来。这个工具也能轻松搞定:

# 这会保留 src/utils 下的内容,并将其提升为仓库的根目录,丢弃其他所有文件git filter-repo --subdirectory-filter src/utils/ 

清理后的收尾工作(非常重要!)

由于 git-filter-repo 是具有破坏性的,为了防止意外的误操作覆盖远程分支,工具在执行完毕后会自动移除你的 remote(远程源)配置

因此,当你确认本地仓库清理无误,且 .git 文件夹体积显著减小后,需要重新关联并推送到远程:

# 1. 重新添加远程仓库地址git remote add origin <你的远程仓库URL># 2. 强制推送所有分支到远程服务器git push origin --force --all # 3. 如果你有标签(Tags),也需要强制推送标签git push origin --force --tags 

团队协作注意事项:
由于你重写了公共历史,团队中的其他成员不能再使用简单的 git pull。他们需要重新 clone 仓库,或者使用 git fetch origin && git reset --hard origin/main(假设主分支是 main)来强制同步你清理后的最新历史。


总结

使用 git-filter-repo 可以极其高效地给 .git 目录“减肥”。日常开发中,我们还是应该养成良好的习惯,提前配置好 .gitignore 文件。对于确实需要版本控制的大型二进制文件,建议尽早引入 Git LFS (Large File Storage) 进行管理。

希望这篇文章能帮你解决 Git 历史清理的难题!如果有任何问题,欢迎在评论区留言讨论。

Read more

SkyWalking - 告警通知渠道集成:Webhook、Slack、钉钉、企业微信

SkyWalking - 告警通知渠道集成:Webhook、Slack、钉钉、企业微信

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕SkyWalking这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * SkyWalking - 告警通知渠道集成:Webhook、Slack、钉钉、企业微信 * 🚨 SkyWalking 告警机制基础 * 告警规则(Alarm Rules) * 通知渠道(Notifiers) * 🔗 Webhook:最通用的集成方式 * 配置 SkyWalking 使用 Webhook * Webhook 接收端开发(Java 示例) * Webhook 集成的优势与注意事项 * 💬 集成 Slack 通知 * 在 Slack 中创建 Incoming Webhook * 配置 SkyWalking * 自定义 Slack

By Ne0inhk
【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

🌈个人主页:易辰君-ZEEKLOG博客 🔥 系列专栏:https://blog.ZEEKLOG.net/2401_86688088/category_12797772.html 目录 前言 一、SessionPage (一)SessionPage 模块的基本功能 (二)基本使用 (三)常用方法 (四)页面元素定位和数据提取 (五)Cookie 和会话管理 (六)SessionPage 的优点和局限性 (七)SessionPage 和 DriverPage 的搭配使用 (八)SessionPage总结 二、WebPage (一)WebPage 的核心功能 (二)WebPage 的基本使用 (三)常用方法 (四)WebPage

By Ne0inhk
下载安装Microsoft Edge Webview2教程

下载安装Microsoft Edge Webview2教程

视频教程 Windows 10/11系统 Webview2安装——win10/11 Windows 7系统 Webview2安装——Win7 图文教程 官网下载最新版Webview2安装包 点击下载安装 官网地址:Microsoft Edge WebView2 | Microsoft Edge Developer 1. 进入官网,点击下载按钮 2. 点击左侧常青引导程序下载按钮 3. 在弹出的页面点击接受并下载,右上角下载管理页面在下载完成后有文件弹出 4. 在游览器下载管理页面直接点击打开文件进行软件的安装 5. 软件安装中,安装完成后无需手动点击自动弹出消失。 graph TD A[安装码尚云标签] --> B{判断安装情况} B -->|Yes| C[打开软件进行标签设计] B --&

By Ne0inhk
翠鸟艺术家:基于WebGL的无代码3D交互设计平台

翠鸟艺术家:基于WebGL的无代码3D交互设计平台

作为专注交互式Web三维设计的工具,翠鸟艺术家(Kingfisher Artist)凭借「无代码、跨设备、全流程」的核心特性,成为设计师与开发者高效搭建3D可视化项目的优选方案。本文从技术可靠性、功能亮点、行业用途三方面展开解析,为专业社区用户提供参考。 获取翠鸟艺术家 注册地址 官网地址 在线文档 翠鸟艺术家——10分钟掌握3D网页零代码制作 一、技术可靠性:基于Web标准的底层支撑 翠鸟艺术家的核心优势在于完全基于Web技术栈,无需安装插件,通过HTML5、WebGL实现浏览器端原生渲染。这意味着: * 跨设备兼容:支持Chrome、Firefox、Edge等主流浏览器,以及移动端iOS/Android,项目可无缝运行在各类设备上; * 部署灵活:提供「网页链接发布」「本地KZS文件导出」「企业版本地部署」三种方式,满足企业级项目的私有化需求; * 性能优化:内置模型合并(减少DrawCall)、纹理自动压缩(WebP格式)、AI积分生成模型等功能,降低大场景运行压力。 二、

By Ne0inhk