Felixyz
Felixyz

Reputation: 19143

Ignoring an already checked-in directory's contents?

I have a git repository that's used only to hold graphics and sound files used in several projects. They are all in one directory without sub-directories. Now I just created a script to copy these assets over from another, structured directory, with several levels of sub-directories.

Now I only want the (source) hierarchical file structure to be tracked by git, and the (target) flat directory (with all the files in one pile) should be ignored.

I've added the target directory to .gitignore, but git is still tracking changes in it. I thought if I commit the deletion of the old file in the target directory, git might stop tracking the new contents (copied in by the script), but it doesn't.

How do I make git forget about the target directory?

Upvotes: 251

Views: 85939

Answers (6)

jone
jone

Reputation: 1914

If you need to have a tracked file (checked in) but do not want to track further changes of a file while keeping it in your local repository as well as in the remote repository, this can be done with:

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

After that, any changes to this file will no longer show up in git status.

To undo this, use the following command:

git update-index --no-assume-unchanged path/to/file.txt

Upvotes: 90

Ced
Ced

Reputation: 1539

TL;DR to clean up your git repository and make sure ALL your ignored items are indeed ignored:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Note: you don't need to specify a directory, this way your are cleaning the entire remote repo.

To go further read this

Upvotes: 5

Steve
Steve

Reputation: 1065

Not sure if this counts or makes me a bad person, but here it goes.

  1. I added *Generated* to the root .gitignore file
  2. I submitted the files I want to keep as GeneratedFile.Whatever.ext.CheckedIn
  3. I made a git hook on post checkout to call a powershell script doing this:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

I do feel a little bad about myself... but it does in fact work.

Upvotes: 0

Gordon Wilson
Gordon Wilson

Reputation: 26384

This command will cause git to untrack your directory and all files under it without actually deleting them:

git rm -r --cached <your directory>

The -r option causes the removal of all files under your directory.

The --cached option causes the files to only be removed from git's index, not your working copy. By default git rm <file> would delete <file>.

Upvotes: 556

Felixyz
Felixyz

Reputation: 19143

Ok, it seems that you must first do a check-in with the directory completely empty (neither old nor new files), and any files added thereafter will be ignored. If you remove the old files add and new ones before committing, the new ones are added to the repo although they should be ignored.

At least, this worked for me in this situation. Would still be great if anyone could provide more insight on what's going on.

Upvotes: -2

Stef
Stef

Reputation: 6981

For a subdirectory called blah/ added to git, both of the following seem to work to ignore new files in blah/. Added to .gitignore:

blah 
blah/*

Upvotes: 2

Related Questions