4

I keep running into a scenario where someone on our team pushes an initial commit without first adding a .gitignore to their project. This results in a bunch of files ending up in the repo that we don't want tracked.

git ls-files -i --exclude-from=.gitignore
gives me a list of files that are ignored by .gitignore

and

git rm --cached <file>
lets me remove files one at a time from the repo, but keeps them in my working directory (which I want)

Is there a way I can pipe the file list from ls-files to rm --cached (or some other method altogether that will allow me to remove the tracked, ignored files from my repo)?

One of our team members wrote a shell script that uses regex to do it, but I'm looking for a command-line only solution (if one exists).

WNRosenberg
  • 1,862
  • 5
  • 22
  • 31

1 Answers1

5

You can try:

git rm --cached $(git ls-files -i --exclude-from=.gitignore)

(Following the same idea than what works for deleted files in "git remove files which have been deleted", or in "git: how to add/commit removals made via vanilla rm?", or "Removing multiple files from a Git repo that have already been deleted from disk").

Or: a simple pipe could work too:

git ls-files -i --exclude-from=.gitignore | xargs -0 git rm --cached
Community
  • 1
  • 1
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
  • The first line works for me. The pipe solution gives me a fatal error: `fatal: pathspec 'path/to/file1 path/to/file2' did not match any files` – WNRosenberg Aug 10 '12 at 15:58
  • The second command probably failed for you because the first command succeeded; those files are no longer in the repository, so the error was being raised on trying to remove files no longer there. – Jason Aug 28 '12 at 10:05