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>...]'
4

1 回答 1

28

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

单引号对 CMD 没有特殊含义。不要期望它们与 POSIX shell 一样工作。像这样调用过滤器分支:

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 变量。

因此,请确保'git rm --cached --ignore-unmatch filename.js'在您所在的外壳中被视为字符串。
正如康斯坦丁·凯茨卡洛在评论中指出的那样:

Windows 10、PyCharm、GitPython,与所讨论的命令相同。
只需更改'"字符串内部即可!

于 2014-01-28T07:52:12.140 回答