git rm --cached everything that is listed in .gitignore

3.7k Views Asked by At

I added .gitignore to my project after I had everything commited. Now I want to run a command like:

git rm --cached *everything_listed_in_gitignore*

How can this be achieved? Thank you in advance.

3

There are 3 best solutions below

1
On BEST ANSWER

I'm always using the following line to remove files listed in my .gitignore:

grep -vP "^(#|\$)" .gitignore|sed "s/^\///"|xargs rm -f
  1. This will find lines in .gitignore that do not match (-v option to grep) the regular expression ^(#|\$) matching lines that start with # (comments) or empty lines.

  2. Then sed will remove a forward slash / at the start of the line.

  3. The results are passed to rm -f using xargs, which you could replace with git rm --cached

Note:

Your .gitignore file can contain entries like *.tmp to ignore all .tmp files throughout the project. The above command would only remove *.tmp files from the root. Only full paths will be handled correctly.

0
On

I found another way that works even better in any operating system from https://ardalis.com/how-to-make-git-forget-tracked-files-in-gitignore .

After adding new rules to .gitignore

git rm -r --cached .

git add .

Basically, it removes everything and adds everything back. When adding, Git will ignore files based on .gitignore

2
On

There is a shorter version, the answer is taken from here.

You can also remove files from the repository based on your .gitignore without deleting them from the local file system:

git rm --cached `git ls-files -i -X .gitignore`

Or, alternatively, on Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)