git清除仓库敏感文件并同步至远端的操作

以下是使用 git filter-repo 清除仓库敏感文件并同步至远端的完整操作文档。请严格按照顺序执行,避免历史污染或数据丢失。


📋 前置准备

  1. 通知团队暂停开发:在操作期间禁止任何人推送代码,否则其提交会重新引入被删除的文件。

  2. 完整备份仓库

    bash 复制代码
    # 克隆一份完整镜像作为灾备
    git clone --mirror <repo-url> backup-repo.git
  3. 安装 git-filter-repo (推荐使用 pip):

    bash 复制代码
    pip install git-filter-repo
  4. 确保本地仓库是最新全量克隆 (非 shallow clone):

    bash 复制代码
    git fetch --all
    git pull --all

🔧 第一步:执行历史重写

⚠️ filter-repo 默认重写所有分支和标签,与当前所在分支无关。无需切换分支。

bash 复制代码
# 从整个仓库历史中彻底移除 .env 文件
git filter-repo --path .env --invert-paths --force
  • --path .env:指定目标文件路径(支持通配符,如 *.envconfig/.env
  • --invert-paths:排除该路径(即删除),不加此参数则为仅保留
  • --force:跳过 "fresh clone" 安全检查(确认已备份后可加)

✅ 第二步:验证清除结果

必须在推送前确认,否则可能将未清理的历史推送到远端。

bash 复制代码
# 搜索所有分支/标签历史中是否仍存在 .env
git log --all --full-history -- .env
  • 无任何输出 → ✅ 清除成功,继续下一步
  • 有输出 → ❌ 仍有残留,停止操作,检查路径是否正确或是否存在同名变体(如 .env.local

🚀 第三步:推送到远端

3.1 解除 GitLab/GitHub 分支保护

master/main/dev 等分支受保护,需先在平台设置中:

  • 开启 Allowed to force push,或
  • 临时 Unprotect 分支(推送后立即恢复)
3.2 更新远程跟踪引用(防止 stale info)
bash 复制代码
git fetch origin
3.3 强制推送所有分支和标签
bash 复制代码
git push origin --all --force-with-lease
git push origin --tags --force-with-lease

💡 若遇大仓库 HTTPS 推送断开,先执行:

bash 复制代码
git config http.postBuffer 524288000

或改用 SSH 协议推送。推送完成后可恢复默认:git config --unset http.postBuffer

3.4 恢复分支保护

推送成功后立即回到平台重新启用分支保护规则。


📢 第四步:通知团队成员更新本地仓库

将以下通知发送给所有协作者:

【重要】仓库历史已重写,请按以下步骤更新本地环境

由于安全原因,仓库中的 .env 文件已从全部历史中移除。你的本地分支已与远端不兼容,请勿使用 git pull(会导致旧历史合并回来)。

请对每个本地分支执行:

bash 复制代码
git fetch origin
git reset --hard origin/<branch-name>

如果你有未推送的本地提交,请先备份为补丁再重做:

bash 复制代码
git format-patch origin/<branch-name> --stdout > my-changes.patch
git reset --hard origin/<branch-name>
git apply my-changes.patch

完成后请删除本地的 .env 文件(如仍存在于工作区)。


⚠️ 关键注意事项

风险点 说明
不可逆操作 filter-repo 重写后原始 commit hash 永久改变,仅靠备份恢复
CI/CD 缓存 检查流水线、构建缓存、Docker 镜像中是否仍包含旧的 .env,需手动清理
环境变量迁移 确保 .env 内容已迁移至安全的密钥管理服务(如 Vault、GitLab CI Variables)后再执行清除
fork / mirror 如有下游 fork 或镜像仓库,需同步通知其维护者重新同步
GitHub 专用 GitHub 不会自动 GC 已删除的对象,如需立即生效需联系 GitHub Support 触发 GC
相关推荐
Brilliantwxx4 小时前
【Linux】 开发|Git 版本控制与 gdb/cgdb 调试
linux·笔记·git
.Hypocritical.1 天前
Git 全套实操|配置 /.gitignore/ 分支合并 / 冲突解决 /git stash 完整教程
git
来日方长。。。。long1 天前
Hermes Agent橙皮书共读|第三篇:保姆级实战部署|本地/VPS从零搭建Hermes
ide·git·hermes
其实防守也摸鱼1 天前
VS Code Git 工作树:解锁多分支并行开发新体验
数据库·git·安全·oracle·架构·自动化
ERD Online1 天前
我们怎么设计 good first issue:让第一个 PR 两小时内合入
数据库·git·后端·开源·issue
Python私教2 天前
Codex 自动写 Commit 够安全吗?一套证据化 Git 提交流程
人工智能·git·后端
果果燕2 天前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
美味蛋炒饭.2 天前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
互联网中的一颗神经元2 天前
09 — .git 地图:打开那个隐藏文件夹
大数据·git·elasticsearch