Jim Greenleaf <james.a.greenl...@gmail.com> writes:
> Adeodato Simó <dato <at> net.com.org.es> writes:
>> I was unpleasantly surprised to discover yesterday that doing `git
>> stash` on a repository where I had previously run `git update-index
>> --assume-unchanged FOO` completely lost all changes I had in file FOO.
> I just ran into this today.
> Was a decision about this behavior reached in the intervening time?
When you mark a file assume-unchanged, git internally sets a flag that
this file should not be considered when doing cache refreshes -- the
file is always assumed to be up-to-date.
So while I haven't actually looked into all of the code, I imagine it
goes something like this:
* git-stash uses git update-index --all on all modified files. But it
doesn't show up as modified, because you promised it isn't.
* Later it calls git reset --hard, which blows away the existing state.
This would seem to ignore the assume-unchanged flag in this case, as
otherwise it wouldn't overwrite it.
Whether the last behavior is a bug is in the eye of the beholder. In
your case you apparently lost work. However, 'git reset --hard' in
itself should discard all uncommitted work without asking any further
questions (because it's --hard). So the bug is then in the sequence
ask about uncommitted work
save it elsewhere
git reset --hard
assuming that this actually makes sure nothing gets lost. But the only
thing that was lost was *files that you promised would not be changed*.
What's really unfortunate is that we caused this in the first place by
Pasky's 6259ac6 (Documentation: How to ignore local changes in tracked
files, 2008-07-18). It recommends exactly the --assume-unchanged
strategy to ignore changes to tracked files.
And it's hard to disagree with its commit message:
This is currently probably one of the top FAQs at #git and the
--assume-unchanged switch is not widely known
Except that now the corresponding FAQ is that we have to actively
dissuade people from using --assume-unchanged precisely because it keeps
So maybe it would be time to first make up our minds as to what
--assume-unchanged should actually mean:
* Ignore changes to a tracked file, but treat them as valuable. In
this case we'd have to make sure that failures like git-stash's are
* Ignore changes to a tracked file, as in "who cares if it was changed".
* A very specific optimization for users who know what they are doing.
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html