Removing sensitive data from Git. "fatal: ambiguous argument 'rm'"

ambiguous-grammar, git, linux

Solution

It depends on the shell you are using. On Windows, with msysgit for instance, see issue 477:

Single quotes do not have a special meaning with CMD. Do not expect that they work the same as with a POSIX shell. Call filter-branch like this:

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

Multiple lines:

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

As mentioned in "How to pass a programmatically generated list of files to `git filter-branch`?"

Each argument to the various `...-filters` needs to be a single string. That string is saved as a shell variable.

So make sure `'git rm --cached --ignore-unmatch filename.js'` is considered a string in the shell you are in. As Constantine Ketskalo points out in the comments:

Windows 10, PyCharm, GitPython, same command as in question. Simply changed `'` to `"` inside the string and it worked!

Problem

I'm trying to run this command: ``` git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filename.js' --prune-empty --tag-name-filter cat -- --all ``` but I keep getting this error: ``` 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>...]' ```

Original source