Skip to content

Commit 8b9b0f3

Browse files
author
Junio C Hamano
committed
"Assume unchanged" git: do not set CE_VALID with --refresh
When working with automatic assume-unchanged mode using core.ignorestat, setting CE_VALID after --refresh makes things more cumbersome to use. Consider this scenario: (1) the working tree is on a filesystem with slow lstat(2). The user sets core.ignorestat = true. (2) "git checkout" to switch to a different branch (or initial checkout) updates all paths and the index starts out with "all clean". (3) The user knows she wants to edit certain paths. She uses update-index --no-assume-unchanged (we could call it --edit; the name is inmaterial) to mark these paths and starts editing. (4) After editing half of the paths marked to be edited, she runs "git status". This runs "update-index --refresh" to reduce the false hits from diff-files. (5) Now the other half of the paths, since she has not changed them, are found to match the index, and CE_VALID is set on them again. For this reason, this commit makes update-index --refresh not to set CE_VALID even after the path without CE_VALID are verified to be up to date. The user still can run --really-refresh to force lstat() to match the index entries to the reality. Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 5f73076 commit 8b9b0f3

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

update-index.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,15 @@ static struct cache_entry *refresh_entry(struct cache_entry *ce, int really)
172172
memcpy(updated, ce, size);
173173
fill_stat_cache_info(updated, &st);
174174

175+
/* In this case, if really is not set, we should leave
176+
* CE_VALID bit alone. Otherwise, paths marked with
177+
* --no-assume-unchanged (i.e. things to be edited) will
178+
* reacquire CE_VALID bit automatically, which is not
179+
* really what we want.
180+
*/
181+
if (!really && assume_unchanged && !(ce->ce_flags & htons(CE_VALID)))
182+
updated->ce_flags &= ~htons(CE_VALID);
183+
175184
return updated;
176185
}
177186

0 commit comments

Comments
 (0)