从Git中删除敏感数据。"致命错误:模糊参数'rm'"

21

我试图运行这个命令:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filename.js' --prune-empty --tag-name-filter cat -- --all

但我一直收到这个错误:

fatal: ambiguous argument 'rm': unknown revision or path not in the working tree
.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

这个问题可能更适合在Server Fault网站上解决。 - Patrick Moore
5
在Windows CMD中,使用双引号 " 而不是单引号 '。 - Víctor Velarde
在 Git Bash 中执行对我有用。 - sillo01
2个回答

28

这取决于您使用的shell。例如,在Windows上,使用msysgit,请参见问题477

CMD不会将单引号视为特殊字符。不要指望它们与POSIX shell的作用方式相同。请像这样调用filter-branch:

git filter-branch --commit-filter "GIT_COMMITTER_NAME=void GIT_AUTHOR_NAME=void GIT_COMMITTER_EMAIL=just.a.test@kernel.org GIT_AUTHOR_EMAIL=just.a.test@kernel.org; git commit-tree \"$@\"" HEAD

多行文本:

git filter-branch --commit-filter "GIT_COMMITTER_NAME=void \
                                   GIT_AUTHOR_NAME=void \
                                   GIT_COMMITTER_EMAIL=just.a.test@kernel.org \
                                   GIT_AUTHOR_EMAIL=just.a.test@kernel.org; \
                                   git commit-tree \"$@\"" HEAD

如何将程序生成的文件列表传递给git filter-branch?"所述:

各种...-filters的每个参数都需要是单个字符串。该字符串将保存为一个shell变量。

因此,请确保在您所在的shell中将'git rm --cached --ignore-unmatch filename.js'视为字符串。
正如Constantine Ketskalo评论中指出的那样:

Windows 10、PyCharm、GitPython,与问题中相同的命令。
只需在字符串内部更改'"即可。


我尝试使用已更正的格式两次进行此调用,但第二次出现以下情况:无法创建新备份。在refs/original/中已经存在先前的备份/使用-f强制覆盖备份/rm:无法删除'/YOURPATH/.git-rewrite/backup-refs':权限被拒绝/rm:无法删除目录'/YOURPATH/.git-rewrite':目录不为空 - drzaus
@drzaus 是的,你可能需要手动删除 /YOURPATH/.git-rewrite 文件夹。 - VonC
请确保在您所使用的 shell 中,'git rm --cached --ignore-unmatch filename.js' 被视为字符串。非常感谢 VonC,这节省了我不知道多少时间。在 Windows 10、PyCharm 和 GitPython 中,与问题中相同的命令。只需在字符串内部将 ' 更改为 ",就可以解决问题! - Constantine Ketskalo
1
@ConstantineKetskalo 谢谢您的反馈。我已将您的评论包含在答案中以增加可见性。 - VonC

2
在Windows上,你需要使用双引号"而不是单引号'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接