I'm testing on my local Windows machine before trying some things on my git-controlled site.
I have:
gittesting/repo1:
file.txt
ignoreme:
ignore.txt
and
gittesting/repo2
file.txt
ignoreme:
ignore.txt
Repo2 is a copy of repo1, and ignoreme is already being tracked. The ignore.txt file becomes changed in repo2, but I want to stop tracking it and for git to completely ignore it. The problem is that if I create a .gitignore file and add ignoreme, it's too late because it's already being tracked, so I would have to do git rm --cached ignore, but then it's marked as deleted and if I pulled the commit to repo1, the directory would be deleted instead of being left alone..
To sum it up:
I've looked online, asked in the IRC, and looked at the very related questions, but can't find a way to do this. I know the example seems trivial, but it's exactly what I need to do on my site, where the directory is Forum/cache instead.
If I understand your question correctly, you want repo2 to know about the ignoreme/ directory, but you don't want Git to care about any modifications to the directory. And git rm --cached won't help you because you're telling Git to stop tracking this content from now on.
Git's solution for keeping track of content, but fixed at a certain point, is through submodules. This except from the Git Book explains (emphasis added):
Although
rackis a subdirectory in your working directory, Git sees it as a submodule and doesn’t track its contents when you’re not in that directory. Instead, Git records it as a particular commit from that repository.
You could try the following:
Copy the ignoreme/ directory to a new location, and make it a git repository
Add it back as a submodule in repo2:
git submodule add file:///path/to/ignoreme ignoreme
git commit -m"Add ignoreme/ as a submodule"
The ignoreme submodule is now fixed to a particular commit. repo2 is still tracking whatever content is inside the submodule, but any changes to files in ignoreme/ will not be tracked in repo2 unless you commit them in the submodule. Let's say ignoreme/ignore.txt was modified somehow:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
# (commit or discard the untracked or modified content in submodules)
#
# modified: ignoreme (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")
Even if you run git add ., the changes in ignoreme/ignore.txt will not be added to the index unless they are committed to the submodule like so:
$ cd ignoreme
$ git commit -am"Time to change ignore.txt"
$ cd ..
$ git add .
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: ignoreme
#
However if you want to forget the local modifications in the submodule:
$ cd ignoreme
$ git reset --hard
$ cd ..