git-update-index
Register file contents in the working tree to the index
TLDR
Pretend that a modified file is unchanged (git status will not show this as changed)
SYNOPSIS
gitupdate -index [ --add] [ --remove | --force -remove] [ --replace] [ --refresh] [ -q] [ --unmerged] [ --ignore -missing] [( --cacheinfo <mode>,<object>,<file>) ...] [ --chmod=(+| -)x] [ --[no -]assume -unchanged] [ --[no -]skip -worktree] [ --[no -]fsmonitor -valid] [ --ignore -submodules] [ --[no -]split -index] [ --[no -|test -|force -]untracked -cache] [ --[no -]fsmonitor] [ --really -refresh] [ --unresolve] [ --again | -g] [ --info -only] [ --index -info] [ -z] [ --stdin] [ --index -version <n>] [ --verbose] [ --] [<file> ...]
UNTRACKED CACHE
$ git -c core .untrackedCache=false status .RE This bug has also been shown to affect non -symlink cases of replacing a directory with a file when it comes to the internal structures of the untracked cache, but no case has been reported where this resulted in wrong "git status" output . There are also cases where existing indexes written by git versions before 2 .17 will reference directories that don exist anymore, potentially causing many "could not open directory" warnings to be printed on "git status" . These are new warnings for existing issues that were previously silently discarded . As with the bug described above the solution is to one -off do a "git status" run with core.untrackedCache=false to flush out the leftover bad data .
FILE SYSTEM MONITOR
CONFIGURATION
GIT
EXAMPLES
$ git checkout -index -n -f -a && git update -index --ignore -missing --refresh .RE
On an inefficient filesystem with core.ignorestat set .RS 4
$ git update -index --really -refresh (1) $ git update -index --no -assume -unchanged foo .c (2) $ git diff --name -only (3) $ edit foo .c $ git diff --name -only (4) M foo .c $ git update -index foo .c (5) $ git diff --name -only (6) $ edit foo .c $ git diff --name -only (7) $ git update -index --no -assume -unchanged foo .c (8) $ git diff --name -only (9) M foo .c .RE 1. forceslstat(2) to set "assume unchanged" bits for paths that match index .
2. markthe path to be edited .
3. thisdoes lstat(2) and finds index matches the path .
4. thisdoes lstat(2) and finds index does not match the path .
5. registeringthe new version to index sets "assume unchanged" bit .
6. andit is assumed unchanged .
7. evenafter you edit it .
8. youcan tell about the change after the fact .
9. nowit checks with lstat(2) and finds it has been changed .
"SKIP −WORKTREE BIT"
"USING −−REFRESH"
"USING −−CACHEINFO OR −−INFO −ONLY"
$ git update -index --add --cacheinfo <mode>,<sha1>,<path> .RE --info -only is used to register files without placing them in the object database . This is useful for status -only repositories . Both --cacheinfo and --info -only behave similarly: the index is updated but the object database isn . --cacheinfo is useful when the object is in the database but the file isn available locally . --info -only is useful when the file is available, but you do not wish to update the object database .
"USING −−INDEX −INFO"
" 1." 4.2 mode SP type SP sha1 TAB path This format is to stuff gitls -tree output into the index . '-04' 2. '+01' .sp -1
" 2." 4.2 mode SP sha1 SP stage TAB path This format is to put higher order stages into the index file and matches gitls -files --stage output . '-04' 3. '+01' .sp -1
" 3." 4.2 mode SP sha1 TAB path This format is no longer produced by any Git command, but is and will continue to be supported by update-index --index -info . To place a higher stage entry to the index, the path should first be removed by feeding a mode=0 entry for the path, and then feeding necessary input lines in the third format . For example, starting with this index: .RS 4
$ git ls -files -s 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0 frotz .RE you can feed the following input to --index -info : .RS 4
$ git update -index --index -info 0 0000000000000000000000000000000000000000 frotz 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz 100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz .RE The first line of the input feeds 0 as the mode to remove the path; the SHA -1 does not matter as long as it is well formatted . Then the second and third line feeds stage 1 and stage 2 entries for that path . After the above, we would end up with this: .RS 4
$ git ls -files -s 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz 100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz .RE
"USING UNCHANGED BIT"
DESCRIPTION
OPTIONS
--add If a specified file isn in the index already then it added . Default behaviour is to ignore new files .
--remove If a specified file is in the index but is missing then it removed . Default behavior is to ignore removed file .
--refresh Looks at the current index and checks to see if merges or updates are needed by checking stat() information .
-q Quiet . If --refresh finds that the index needs an update, the default behavior is to error out . This option makes gitupdate -index continue anyway .
--ignore -submodules Do not try to update submodules . This option is only respected when passed before --refresh .
--unmerged If --refresh finds unmerged changes in the index, the default behavior is to error out . This option makes gitupdate -index continue anyway .
--ignore -missing Ignores missing files during a --refresh
--cacheinfo <mode>,<object>,<path>, --cacheinfo <mode> <object> <path> Directly insert the specified info into the index . For backward compatibility, you can also give these three arguments as three separate parameters, but new users are encouraged to use a single -parameter form .
--index -info Read index information from stdin .
--chmod=(+| -)x Set the execute permissions on the updated files .
--[no -]assume -unchanged When this flag is specified, the object names recorded for the paths are not updated . Instead, this option sets/unsets the "assume unchanged" bit for the paths . When the "assume unchanged" bit is on, the user promises not to change the file and allows Git to assume that the working tree file matches what is recorded in the index . If you want to change the working tree file, you need to unset the bit to tell Git . This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e .g . cifs) .
--really -refresh Like --refresh ,but checks stat information unconditionally, without regard to the "assume unchanged" setting .
--[no -]skip -worktree When one of these flags is specified, the object name recorded for the paths are not updated . Instead, these options set and unset the "skip -worktree" bit for the paths . See section "Skip -worktree bit" below for more information .
--[no -]fsmonitor -valid When one of these flags is specified, the object name recorded for the paths are not updated . Instead, these options set and unset the "fsmonitor valid" bit for the paths . See section "File System Monitor" below for more information .
-g, --again Runs gitupdate -index itself on the paths whose index entries are different from those from the HEAD commit .
--unresolve Restores the unmerged or needsupdating state of a file during a merge if it was cleared by accident .
--info -only Do not create objects in the object database for all <file> arguments that follow this flag; just insert their object IDs into the index .
--force -remove Remove the file from the index even when the working directory still has such a file . (Implies --remove .)
--replace By default, when a file path exists in the index, gitupdate -index refuses an attempt to add path/file . Similarly if a file path/file exists, a file path cannot be added . With --replace flag, existing entries that conflict with the entry being added are automatically removed with warning messages .
--stdin Instead of taking list of paths from the command line, read list of paths from the standard input . Paths are separated by LF (i .e . one path per line) by default .
--verbose Report what is being added and removed from index .
--index -version <n> Write the resulting index out in the named on -disk format version . Supported versions are 2, 3 and 4 . The current default version is 2 or 3, depending on whether extra features are used, such as gitadd -N . Version 4 performs a simple pathname compression that reduces index size by 30% -50% on large repositories, which results in faster load time . Version 4 is relatively young (first released in 1 .8 .0 in October 2012) . Other Git implementations such as JGit and libgit2 may not support it yet .
-z Only meaningful with --stdin or --index -info ;paths are separated with NUL character instead of LF .
--split -index, --no -split -index Enable or disable split index mode . If split -index mode is already enabled and --split -index is given again, all changes in $GIT_DIR/index are pushed back to the shared index file . These options take effect whatever the value of the core.splitIndex configuration variable (see git-config (1)). But a warning is emitted when the change goes against the configured value, as the configured value will take effect next time the index is read and this will remove the intended effect of the option .
--untracked -cache, --no -untracked -cache Enable or disable untracked cache feature . Please use --test -untracked -cache before enabling it . These options take effect whatever the value of the core.untrackedCache configuration variable (see git-config (1)). But a warning is emitted when the change goes against the configured value, as the configured value will take effect next time the index is read and this will remove the intended effect of the option .
--test -untracked -cache Only perform tests on the working directory to make sure untracked cache can be used . You have to manually enable untracked cache using --untracked -cache or --force -untracked -cache or the core.untrackedCache configuration variable afterwards if you really want to use it . If a test fails the exit code is 1 and a message explains what is not working as needed, otherwise the exit code is 0 and OK is printed .
--force -untracked -cache Same as --untracked -cache . Provided for backwards compatibility with older versions of Git where --untracked -cache used to imply --test -untracked -cache but this option would enable the extension unconditionally .
--fsmonitor, --no -fsmonitor Enable or disable files system monitor feature . These options take effect whatever the value of the core.fsmonitor configuration variable (see git-config (1)). But a warning is emitted when the change goes against the configured value, as the configured value will take effect next time the index is read and this will remove the intended effect of the option .
-- Do not interpret any more arguments as options .
<file> Files to act on . Note that files beginning with . are discarded . This includes ./file and dir/./file . If you don want this, then use cleaner names . The same applies to directories ending / and paths with //
SPLIT INDEX
SEE ALSO
git-config(1), git-add(1), git-ls-files(1)