使用git filter-branch删除Git历史文件时报pathspec未匹配错误如何解决
问题原因
这个报错不是你当前填写的路径有误,本质是git rm --cached默认要求目标路径存在,而你要删除的文件是后来才提交到仓库的,在更早的提交记录里这个路径不存在,执行到对应提交的时候就会触发匹配失败的报错。
解决方法
给git rm命令加上--ignore-unmatch参数,遇到不存在该文件的提交时会自动跳过,不会终止执行,修改后的命令如下:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch "app/src/main/java/com/corecz/gitfilter/ui/TypingTestActivity.java"' HEAD
执行完成后需要强制推送到远程仓库才能覆盖历史记录:
git push origin --force --all
注意事项
- 操作前建议先备份整个仓库,避免误操作丢失提交记录
- 如果仓库有其他协作者,需要通知所有协作者重新克隆更新后的仓库,或者执行变基操作同步新的历史记录,避免旧的提交记录被重新推送回来
- 目前Git官方更推荐使用
git-filter-repo工具来做历史重写操作,比filter-branch效率更高、容错性更好,如果后续有更复杂的历史清理需求可以尝试使用
内容的提问来源于stack exchange,提问作者Corec
相关产品推荐
相关产品推荐

