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
相关推荐
胖大和尚8 小时前
Git初始化本地文件夹,并推送到远端
git
啵啵啵12349 小时前
Git 底层原理:分支为什么只是一个 41 字节的文件
git
demon755200310 小时前
Git Worktree详解介绍
git·worktree
胖大和尚12 小时前
当前仓库推送到同一台机器上的另一个文件夹
git
轮到我狗叫了2 天前
git - 版本控制工具 - 对应的常见命令 - 以及无需后续每次手动source conda
git
changxiang2 天前
GIT 备忘
git
DogDaoDao2 天前
Windows 开发提效工具全景指南:60+ 工具的工程化分层配置
windows·git·程序员·开发工具·powershell·everything·msys2
wdfk_prog2 天前
GitHub push 失败:如何扫描并清理 Git 历史中的大文件
git·elasticsearch·github
大明二代2 天前
使用 Traefik、cert-manager 和 DNS-01 为内网 Kubernetes 服务配置 HTTPS
git·kubernetes·flux
小芒果_013 天前
git常用命令速查
大数据·git·elasticsearch