替换历史文本是什么
git filter-repo --replace-text 按规则文件批量替换历史内容,用于清理泄露的凭证、内部域名、路径等敏感串。规则支持字面量与正则(regex: 前缀),替换作用于所有历史提交与引用,全部相关哈希都会变化;属于必须先备份、在克隆副本上操作的高风险改写。
基本信息
| 用法 | git filter-repo --replace-text <规则文件> |
|---|---|
| 规则语法 | 每行「匹配=替换」;literal: 与 regex: 前缀明确模式 |
| 整行匹配 | 规则中写入换行符可做整行替换 |
| 范围限定 | --path 等选项可限定文件范围 |
| 依赖 | 需安装 git-filter-repo(独立工具,非 git 内置) |
| 前置 | 先在专用克隆副本执行,正式仓库另存备份 |
典型使用场景
- 凭证泄露应急:令牌或密钥进过历史,清理并轮换。
- 开源去标识:发布前替换内部域名、私有路径与项目代号。
- 误提交测试数据:批量替换为占位符再交付。
- 合规要求:删除特定字符串后才允许对外镜像。
- 仓库合并前预处理:先清理来源历史中的敏感内容再并入。
操作示例
操作示例
cat > rules.txt <<'EOF'
SECRET_TOKEN==>***REMOVED***
regex:AKIA[0-9A-Z]{16}==>AKIA*** # 正则匹配访问键样式
EOF
git filter-repo --replace-text rules.txt
git log -S 'SECRET_TOKEN' --all --oneline # 复查:应没有任何结果规则写法
| 写法 | 匹配方式 | 例子 |
|---|---|---|
| 直接书写 | 字面量精确匹配 | SECRET_TOKEN==>***REMOVED*** |
| literal: | 明确按字面量处理 | literal:key==>*** |
| regex: | 正则表达式匹配 | regex:AKIA[0-9A-Z]{16}==>AKIA*** |
| 含换行符 | 整行替换 | 用于替换完整一行的内容 |
历史里出现过的凭证必须视为已泄露:先轮换密钥,再清理历史;只清理不轮换等于没处理。改写后推送需要强推并通知所有协作者,镜像与 fork 要逐一核查,必要时联系托管平台清理缓存引用。