Search code examples
gitignoregitignore

How to remove files that are listed in the .gitignore but still on the repository?


I have some files in my repository that should be ignored, i added them to the .gitignore but, of course, they are not removed from my repository.

So my question is, is there a magic command or script using filter-branch that can rewrite my history and remove all these files easily? Or simply a command that will create a commit that will remove them ?


Solution

  • You can remove them from the repository manually:

    git rm --cached file1 file2 dir/file3
    

    Or, if you have a lot of files:

    git rm --cached `git ls-files -i -c --exclude-from=.gitignore`
    

    But this doesn't seem to work in Git Bash on Windows. It produces an error message. The following works better (-d '\n' to split input line by line):

    git ls-files -i -c --exclude-from=.gitignore | xargs -d '\n' git rm --cached  
    

    If you are using PowerShell on Windows this works too (handles spaces in path and filenames):

    git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}
    

    Regarding rewriting the whole history without these files, I highly doubt there's an automatic way to do it.
    And we all know that rewriting the history is bad, don't we? :)