21

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>...]'
naXa stands with Ukraine
  • 35,493
  • 19
  • 190
  • 259
Jonathan
  • 3,016
  • 9
  • 43
  • 74

2 Answers2

28

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!

VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
  • I tried doing this call twice (using the corrected format), only to get on the second time the following: `Cannot create a new backup. A previous backup already exists in refs/original/ Force overwriting the backup with -f rm: cannot remove '/YOURPATH/.git-rewrite/backup-refs': Permission denied rm: cannot remove directory '/YOURPATH/.git-rewrite': Directory not empty`. – drzaus Oct 03 '14 at 14:05
  • @drzaus yes, you might have to remove manually the `/YOURPATH/.git-rewrite` folder. – VonC Oct 03 '14 at 14:38
  • `So make sure 'git rm --cached --ignore-unmatch filename.js' is considered a string in the shell you are in.` VonC, thank you so much. It saved me who knows how much more time it could be. Windows 10, PyCharm, GitPython, same command as in question. Simply changed `'` to `"` inside the string and it worked! – Constantine Ketskalo May 30 '19 at 12:47
  • 1
    @ConstantineKetskalo Thank you for this feedback. I have included your comment in the answer for more visibility. – VonC May 30 '19 at 22:55
2

On windows, you have to use double quote " instead of single '

Luca C.
  • 11,714
  • 1
  • 86
  • 77