Make use of stat.ctime configurable A new configuration variable 'core.trustctime' is introduced to allow ignoring st_ctime information when checking if paths in the working tree has changed, because there are situations where it produces too much false positives. Like when file system crawlers keep changing it when scanning and using the ctime for marking scanned files. The default is to notice ctime changes. Signed-off-by: Alex Riesen <raa.lkml@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff --git a/Documentation/config.txt b/Documentation/config.txt index 1a13abc..61c3760 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt
@@ -117,6 +117,13 @@ the working copy are ignored; useful on broken filesystems like FAT. See linkgit:git-update-index[1]. True by default. +core.trustctime:: + If false, the ctime differences between the index and the + working copy are ignored; useful when the inode change time + is regularly modified by something outside Git (file system + crawlers and some backup systems). + See linkgit:git-update-index[1]. True by default. + core.quotepath:: The commands that output paths (e.g. 'ls-files', 'diff'), when not given the `-z` option, will quote
diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index 6b930bc..1d9d81a 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt
@@ -323,6 +323,11 @@ The command looks at `core.ignorestat` configuration variable. See 'Using "assume unchanged" bit' section above. +The command also looks at `core.trustctime` configuration variable. +It can be useful when the inode change time is regularly modified by +something outside Git (file system crawlers and backup systems use +ctime for marking files processed) (see linkgit:git-config[1]). + SEE ALSO --------
diff --git a/cache.h b/cache.h index 4b6c0a6..2475de9 100644 --- a/cache.h +++ b/cache.h
@@ -423,6 +423,7 @@ /* Environment bits from configuration mechanism */ extern int trust_executable_bit; +extern int trust_ctime; extern int quote_path_fully; extern int has_symlinks; extern int ignore_case;
diff --git a/config.c b/config.c index 1e066c7..53f04a0 100644 --- a/config.c +++ b/config.c
@@ -341,6 +341,10 @@ trust_executable_bit = git_config_bool(var, value); return 0; } + if (!strcmp(var, "core.trustctime")) { + trust_ctime = git_config_bool(var, value); + return 0; + } if (!strcmp(var, "core.quotepath")) { quote_path_fully = git_config_bool(var, value);
diff --git a/environment.c b/environment.c index 4a88a17..0c6d11f 100644 --- a/environment.c +++ b/environment.c
@@ -13,6 +13,7 @@ char git_default_name[MAX_GITNAME]; int user_ident_explicitly_given; int trust_executable_bit = 1; +int trust_ctime = 1; int has_symlinks = 1; int ignore_case; int assume_unchanged;
diff --git a/read-cache.c b/read-cache.c index 6c08803..1cae361 100644 --- a/read-cache.c +++ b/read-cache.c
@@ -197,7 +197,7 @@ } if (ce->ce_mtime != (unsigned int) st->st_mtime) changed |= MTIME_CHANGED; - if (ce->ce_ctime != (unsigned int) st->st_ctime) + if (trust_ctime && ce->ce_ctime != (unsigned int) st->st_ctime) changed |= CTIME_CHANGED; if (ce->ce_uid != (unsigned int) st->st_uid ||