Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ignore files that have already been committed to a Git repository [duplicate]

I have an already initialized Git repository that I added a .gitignore file to. How can I refresh the file index so the files I want ignored get ignored?

like image 665
trobrock Avatar asked Jul 16 '09 19:07

trobrock


People also ask

How can I ignore files that have already been committed to the repo?

Git can only ignore files that are untracked - files that haven't been committed to the repository, yet. That's why, when you create a new repository, you should also create a . gitignore file with all the file patterns you want to ignore.

How do I ignore an already committed file in Git?

If you want to ignore a file that you've committed in the past, you'll need to delete the file from your repository and then add a . gitignore rule for it. Using the --cached option with git rm means that the file will be deleted from your repository, but will remain in your working directory as an ignored file.

How do I Untrack a committed file?

Tell Git to untrack file Use git rm to Git untrack file. Both of the commands above git untrack file without deleting. This is because of the cached option. Removing the cached option will delete it from your disk.


21 Answers

To untrack a single file that has already been added/initialized to your repository, i.e., stop tracking the file but not delete it from your system use: git rm --cached filename

To untrack every file that is now in your .gitignore:

First commit any outstanding code changes, and then, run this command:

git rm -r --cached .

This removes any changed files from the index(staging area), then just run:

git add .

Commit it:

git commit -m ".gitignore is now working"

To undo git rm --cached filename, use git add filename.

Make sure to commit all your important changes before running git add . Otherwise, you will lose any changes to other files.

Please be careful, when you push this to a repository and pull from somewhere else into a state where those files are still tracked, the files will be DELETED

like image 184
14 revs, 14 users 20% Avatar answered Oct 04 '22 05:10

14 revs, 14 users 20%


If you are trying to ignore changes to a file that's already tracked in the repository (e.g. a dev.properties file that you would need to change for your local environment but you would never want to check in these changes) than what you want to do is:

git update-index --assume-unchanged <file>

If you wanna start tracking changes again

git update-index --no-assume-unchanged <file>

See git-update-index(1) Manual Page.

Also have a look at the skip-worktree and no-skip-worktree options for update-index if you need this to persist past a git-reset (via)


Update: Since people have been asking, here's a convenient (and updated since commented on below) alias for seeing which files are currently "ignored" (--assume-unchanged) in your local workspace

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"
like image 24
dyodji Avatar answered Oct 04 '22 05:10

dyodji


Remove trailing whitespace in .gitignore

Also, make sure you have no trailing whitespace in your .gitignore. I got to this question because I was searching for an answer, then I had a funny feeling I should open the editor instead of just cat'ing .gitignore. Removed a single extra space from the end and poof it works now :)

like image 32
MikeJansen Avatar answered Oct 04 '22 05:10

MikeJansen


To untrack a file that has already been added/initialized to your repository, ie stop tracking the file but not delete it from your system use: git rm --cached filename

like image 23
pagetribe Avatar answered Oct 04 '22 06:10

pagetribe


Yes - .gitignore system only ignores files not currently under version control from git.

I.e. if you've already added a file called test.txt using git-add, then adding test.txt to .gitignore will still cause changes to test.txt to be tracked.

You would have to git rm test.txt first and commit that change. Only then will changes to test.txt be ignored.

like image 36
Antony Stubbs Avatar answered Oct 04 '22 05:10

Antony Stubbs


To remove just a few specific files from being tracked:

git update-index --assume-unchanged path/to/file

If ever you want to start tracking it again:

git update-index --no-assume-unchanged path/to/file                      
like image 34
Mark Salvatore Avatar answered Oct 04 '22 05:10

Mark Salvatore


i followed these steps

git rm -r --cached .
git add .
git reset HEAD

after that, git delete all files (*.swp in my case) that should be ignoring.

like image 24
Orlando Avatar answered Oct 04 '22 07:10

Orlando


Complex answers everywhere!

Just use the following

git rm -r --cached .

It will remove the files you are trying to ignore from the origin and not from the master on your computer!

After that just commit and push!

like image 27
Ahmad Awais Avatar answered Oct 04 '22 07:10

Ahmad Awais


If you want to stop tracking file without deleting the file from your local system, which I prefer for ignoring config/database.yml file. Simply try:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

now, add this file to .gitignore file and commit the changes. And from now on, any changes made to config/database.yml will not get tracked by git.

$ echo config/database.yml >> .gitignore

Thanks

like image 22
przbadu Avatar answered Oct 04 '22 07:10

przbadu


As dav_i says, in order to keep the file in repo and yet removing it from changes without creating an extra commit you can use:

git update-index --assume-unchanged filename
like image 31
Iman Mohamadi Avatar answered Oct 04 '22 06:10

Iman Mohamadi


None of the answers worked for me.

Instead:

  1. Move the file out of the git-controlled directory
  2. Check the removal into git
  3. Move the file back into the git-controlled directory

After moving the file back, git will ignore it.

Works with directories too!

like image 42
Hunter S Avatar answered Oct 04 '22 07:10

Hunter S


Not knowing quite what the 'answer' command did, I ran it, much to my dismay. It recursively removes every file from your git repo.

Stackoverflow to the rescue... How to revert a "git rm -r ."?

git reset HEAD

Did the trick, since I had uncommitted local files that I didn't want to overwrite.

like image 40
averydev Avatar answered Oct 04 '22 05:10

averydev


There is another suggestion maybe for the slow guys like me =) Put the .gitignore file into your repository root not in .git folder. Cheers!

like image 25
Olga Avatar answered Oct 04 '22 06:10

Olga


If the files are already in version control you need to remove them manually.

like image 38
Aragorn Avatar answered Oct 04 '22 07:10

Aragorn


another problem I had was I placed an inline comment.

tmp/*   # ignore my tmp folder (this doesn't work)

this works

# ignore my tmp folder
tmp/
like image 21
kindahero Avatar answered Oct 04 '22 07:10

kindahero


Thanks to your answer, I was able to write this little one-liner to improve it. I ran it on my .gitignore and repo, and had no issues, but if anybody sees any glaring problems, please comment. This should git rm -r --cached from .gitignore:

cat $(git rev-parse --show-toplevel)/.gitIgnore | sed "s/\/$//" | grep -v "^#" | xargs -L 1 -I {} find $(git rev-parse --show-toplevel) -name "{}" | xargs -L 1 git rm -r --cached

Note that you'll get a lot of fatal: pathspec '<pathspec>' did not match any files. That's just for the files which haven't been modified.

like image 23
umop Avatar answered Oct 04 '22 07:10

umop


I have found a weird problem with .gitignore. Everything was in place and seemed correct. The only reason why my .gitignore was "ignored" was, that the line-ending was in Mac-Format (\r). So after saving the file with the correct line-ending (in vi using :set ff=unix) everything worked like a charm!

like image 29
Johannes Vetter Avatar answered Oct 04 '22 06:10

Johannes Vetter


One other problem not mentioned here is if you've created your .gitignore in Windows notepad it can look like gibberish on other platforms as I found out. The key is to make sure you the encoding is set to ANSI in notepad, (or make the file on linux as I did).

From my answer here: https://stackoverflow.com/a/11451916/406592

like image 36
Matt Parkins Avatar answered Oct 04 '22 06:10

Matt Parkins


If you need to stop tracking a lot of ignored files, you can combine some commands:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

This would stop tracking the ignored files. If you want to actually remove files from filesystem, do not use the --cached option. You can also specify a folder to limit the search, such as:

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm

like image 31
Etherealone Avatar answered Oct 04 '22 07:10

Etherealone


On my server linux server (not true on my local dev mac), directories are ignored as long as I don't add an asterisk:

www/archives/*

I don't know why but it made me loose a couple of hours, so I wanted to share...

like image 34
ndemoreau Avatar answered Oct 04 '22 05:10

ndemoreau


One thing to also keep in mind if .gitignore does not seem to be ignoring untracked files is that you should not have comments on the same line as the ignores. So this is okay

# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*

But this will not work:

foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.

.gitignore interprets the latter case as "ignore files named "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc.", which, of course, you don't have.

like image 25
Gabriel Perdue Avatar answered Oct 04 '22 06:10

Gabriel Perdue