I have a file in a git repository that has a local change on it. I want to have git ignore the local change forever, but not the file. In particular,
git add .
should never stage it.git commit -a
shouldn't commit it.Is there a way to do this? Doing some research, I read about "smudge/clean cycles," where, if I read correctly,
I am very new to git and scripting, though (I'm an intern with C# and Java experience), so if that's what I need to do, can you please post detailed directions or a link to a tutorial on how to set a smudge/clean cycle up?
Background: I want my working branch to be out of sync with the trunk. There is a low priority bug that only affects development machines, so rather than fix it, we're just commenting out the offending code. Obviously, we don't want this code to be removed from production, where it works just fine.
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.
To ignore untracked files, you have a file in your git folder called . git/info/exclude . This file is your own gitignore inside your local git folder, which means is not going to be committed or shared with anyone else. You can basically edit this file and stop tracking any (untracked) file.
Set “–assume-unchanged” to a path to exclude to check on git commit and it will exclude your file from git commit. You will need to use the git update-index and –assume-unchanged to exclude files from git commit.
You can use the skip-worktree
bit. Turn it on with:
git update-index --skip-worktree <file>
After that, git will never stage local changes for <file>
and will fail (loudly) if git itself has to write to <file>
(say, in a merge or a checkout).
If you ever want to stage a future change, you can turn it off, stage the new change, and then turn it back on:
git update-index --no-skip-worktree <file>
git add -p <file>
git update-index --skip-worktree <file>
While not perfect, this might be good enough. It will be up to you to notice that <file>
has unstaged changes, since git will no longer tell you that
Note: My original suggestion was to use assume-unchanged
. As explained in Git - Difference Between 'assume-unchanged' and 'skip-worktree', it is really skip-worktree
that you want. In particular, assume-unchanged
is a promise to Git that you won't change the file, and if you violate that promise Git is allowed to erase your changes or commit them! In contrast, Git will not erase or commit your skip-worktree
changes.
These answers are good, but may not best solve @Kevin's problem. I had a similar concern, often editing a config file so the app I was working on would access my own private development database instead of the production one. It's only a matter of time before I accidentally check in and push those config changes! I just needed a light weight way to ignore a file. Here's what I learned:
First, make your needed change to your file. I'll call it my_config
.
Make a patch file of that change with git diff >../somewhere-else/my_config.patch
Now tell git to ignore that file (without having to change the checked-in .gitignore): git update-index --assume-unchanged my_config
Now, as long as you don't make changes to my_config
that you do want to check in, you can work freely. To stop ignoring my_config
, do git update-index --no-assume-unchanged my_config
. After pulling in somebody else's changes to my_config
, you can easily restore your private change with git apply ../somewhere-else/my_config.patch
, then ...assume-unchanged again, as above, and get back to work!
Here are some helpful aliases you can put in your ~/.gitconfig
:
[alias]
unchanged = update-index --assume-unchanged
changed = update-index --no-assume-unchanged
show-unchanged = !"git ls-files -v | sed -e 's/^[a-z] //p; d'"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With