Documentation / git-update-index.txton commit clone: use --progress to force progress reporting (5a518ad)
   1git-update-index(1)
   2===================
   3
   4NAME
   5----
   6git-update-index - Register file contents in the working tree to the index
   7
   8
   9SYNOPSIS
  10--------
  11[verse]
  12'git update-index'
  13             [--add] [--remove | --force-remove] [--replace]
  14             [--refresh] [-q] [--unmerged] [--ignore-missing]
  15             [--cacheinfo <mode> <object> <file>]\*
  16             [--chmod=(+|-)x]
  17             [--assume-unchanged | --no-assume-unchanged]
  18             [--ignore-submodules]
  19             [--really-refresh] [--unresolve] [--again | -g]
  20             [--info-only] [--index-info]
  21             [-z] [--stdin]
  22             [--verbose]
  23             [--] [<file>]\*
  24
  25DESCRIPTION
  26-----------
  27Modifies the index or directory cache. Each file mentioned is updated
  28into the index and any 'unmerged' or 'needs updating' state is
  29cleared.
  30
  31See also linkgit:git-add[1] for a more user-friendly way to do some of
  32the most common operations on the index.
  33
  34The way 'git-update-index' handles files it is told about can be modified
  35using the various options:
  36
  37OPTIONS
  38-------
  39--add::
  40        If a specified file isn't in the index already then it's
  41        added.
  42        Default behaviour is to ignore new files.
  43
  44--remove::
  45        If a specified file is in the index but is missing then it's
  46        removed.
  47        Default behavior is to ignore removed file.
  48
  49--refresh::
  50        Looks at the current index and checks to see if merges or
  51        updates are needed by checking stat() information.
  52
  53-q::
  54        Quiet.  If --refresh finds that the index needs an update, the
  55        default behavior is to error out.  This option makes
  56        'git-update-index' continue anyway.
  57
  58--ignore-submodules::
  59        Do not try to update submodules.  This option is only respected
  60        when passed before --refresh.
  61
  62--unmerged::
  63        If --refresh finds unmerged changes in the index, the default
  64        behavior is to error out.  This option makes 'git-update-index'
  65        continue anyway.
  66
  67--ignore-missing::
  68        Ignores missing files during a --refresh
  69
  70--cacheinfo <mode> <object> <path>::
  71        Directly insert the specified info into the index.
  72
  73--index-info::
  74        Read index information from stdin.
  75
  76--chmod=(+|-)x::
  77        Set the execute permissions on the updated files.
  78
  79--assume-unchanged::
  80--no-assume-unchanged::
  81        When these flags are specified, the object names recorded
  82        for the paths are not updated.  Instead, these options
  83        set and unset the "assume unchanged" bit for the
  84        paths.  When the "assume unchanged" bit is on, git stops
  85        checking the working tree files for possible
  86        modifications, so you need to manually unset the bit to
  87        tell git when you change the working tree file. This is
  88        sometimes helpful when working with a big project on a
  89        filesystem that has very slow lstat(2) system call
  90        (e.g. cifs).
  91+
  92This option can be also used as a coarse file-level mechanism
  93to ignore uncommitted changes in tracked files (akin to what
  94`.gitignore` does for untracked files).
  95You should remember that an explicit 'git add' operation will
  96still cause the file to be refreshed from the working tree.
  97Git will fail (gracefully) in case it needs to modify this file
  98in the index e.g. when merging in a commit;
  99thus, in case the assumed-untracked file is changed upstream,
 100you will need to handle the situation manually.
 101
 102--really-refresh::
 103        Like '--refresh', but checks stat information unconditionally,
 104        without regard to the "assume unchanged" setting.
 105
 106-g::
 107--again::
 108        Runs 'git-update-index' itself on the paths whose index
 109        entries are different from those from the `HEAD` commit.
 110
 111--unresolve::
 112        Restores the 'unmerged' or 'needs updating' state of a
 113        file during a merge if it was cleared by accident.
 114
 115--info-only::
 116        Do not create objects in the object database for all
 117        <file> arguments that follow this flag; just insert
 118        their object IDs into the index.
 119
 120--force-remove::
 121        Remove the file from the index even when the working directory
 122        still has such a file. (Implies --remove.)
 123
 124--replace::
 125        By default, when a file `path` exists in the index,
 126        'git-update-index' refuses an attempt to add `path/file`.
 127        Similarly if a file `path/file` exists, a file `path`
 128        cannot be added.  With --replace flag, existing entries
 129        that conflict with the entry being added are
 130        automatically removed with warning messages.
 131
 132--stdin::
 133        Instead of taking list of paths from the command line,
 134        read list of paths from the standard input.  Paths are
 135        separated by LF (i.e. one path per line) by default.
 136
 137--verbose::
 138        Report what is being added and removed from index.
 139
 140-z::
 141        Only meaningful with `--stdin`; paths are separated with
 142        NUL character instead of LF.
 143
 144\--::
 145        Do not interpret any more arguments as options.
 146
 147<file>::
 148        Files to act on.
 149        Note that files beginning with '.' are discarded. This includes
 150        `./file` and `dir/./file`. If you don't want this, then use
 151        cleaner names.
 152        The same applies to directories ending '/' and paths with '//'
 153
 154Using --refresh
 155---------------
 156'--refresh' does not calculate a new sha1 file or bring the index
 157up-to-date for mode/content changes. But what it *does* do is to
 158"re-match" the stat information of a file with the index, so that you
 159can refresh the index for a file that hasn't been changed but where
 160the stat entry is out of date.
 161
 162For example, you'd want to do this after doing a 'git-read-tree', to link
 163up the stat index details with the proper files.
 164
 165Using --cacheinfo or --info-only
 166--------------------------------
 167'--cacheinfo' is used to register a file that is not in the
 168current working directory.  This is useful for minimum-checkout
 169merging.
 170
 171To pretend you have a file with mode and sha1 at path, say:
 172
 173----------------
 174$ git update-index --cacheinfo mode sha1 path
 175----------------
 176
 177'--info-only' is used to register files without placing them in the object
 178database.  This is useful for status-only repositories.
 179
 180Both '--cacheinfo' and '--info-only' behave similarly: the index is updated
 181but the object database isn't.  '--cacheinfo' is useful when the object is
 182in the database but the file isn't available locally.  '--info-only' is
 183useful when the file is available, but you do not wish to update the
 184object database.
 185
 186
 187Using --index-info
 188------------------
 189
 190`--index-info` is a more powerful mechanism that lets you feed
 191multiple entry definitions from the standard input, and designed
 192specifically for scripts.  It can take inputs of three formats:
 193
 194    . mode         SP sha1          TAB path
 195+
 196The first format is what "git-apply --index-info"
 197reports, and used to reconstruct a partial tree
 198that is used for phony merge base tree when falling
 199back on 3-way merge.
 200
 201    . mode SP type SP sha1          TAB path
 202+
 203The second format is to stuff 'git-ls-tree' output
 204into the index file.
 205
 206    . mode         SP sha1 SP stage TAB path
 207+
 208This format is to put higher order stages into the
 209index file and matches 'git-ls-files --stage' output.
 210
 211To place a higher stage entry to the index, the path should
 212first be removed by feeding a mode=0 entry for the path, and
 213then feeding necessary input lines in the third format.
 214
 215For example, starting with this index:
 216
 217------------
 218$ git ls-files -s
 219100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0       frotz
 220------------
 221
 222you can feed the following input to `--index-info`:
 223
 224------------
 225$ git update-index --index-info
 2260 0000000000000000000000000000000000000000      frotz
 227100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1       frotz
 228100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2       frotz
 229------------
 230
 231The first line of the input feeds 0 as the mode to remove the
 232path; the SHA1 does not matter as long as it is well formatted.
 233Then the second and third line feeds stage 1 and stage 2 entries
 234for that path.  After the above, we would end up with this:
 235
 236------------
 237$ git ls-files -s
 238100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1       frotz
 239100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2       frotz
 240------------
 241
 242
 243Using ``assume unchanged'' bit
 244------------------------------
 245
 246Many operations in git depend on your filesystem to have an
 247efficient `lstat(2)` implementation, so that `st_mtime`
 248information for working tree files can be cheaply checked to see
 249if the file contents have changed from the version recorded in
 250the index file.  Unfortunately, some filesystems have
 251inefficient `lstat(2)`.  If your filesystem is one of them, you
 252can set "assume unchanged" bit to paths you have not changed to
 253cause git not to do this check.  Note that setting this bit on a
 254path does not mean git will check the contents of the file to
 255see if it has changed -- it makes git to omit any checking and
 256assume it has *not* changed.  When you make changes to working
 257tree files, you have to explicitly tell git about it by dropping
 258"assume unchanged" bit, either before or after you modify them.
 259
 260In order to set "assume unchanged" bit, use `--assume-unchanged`
 261option.  To unset, use `--no-assume-unchanged`.
 262
 263The command looks at `core.ignorestat` configuration variable.  When
 264this is true, paths updated with `git update-index paths...` and
 265paths updated with other git commands that update both index and
 266working tree (e.g. 'git-apply --index', 'git-checkout-index -u',
 267and 'git-read-tree -u') are automatically marked as "assume
 268unchanged".  Note that "assume unchanged" bit is *not* set if
 269`git update-index --refresh` finds the working tree file matches
 270the index (use `git update-index --really-refresh` if you want
 271to mark them as "assume unchanged").
 272
 273
 274Examples
 275--------
 276To update and refresh only the files already checked out:
 277
 278----------------
 279$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
 280----------------
 281
 282On an inefficient filesystem with `core.ignorestat` set::
 283+
 284------------
 285$ git update-index --really-refresh              <1>
 286$ git update-index --no-assume-unchanged foo.c   <2>
 287$ git diff --name-only                           <3>
 288$ edit foo.c
 289$ git diff --name-only                           <4>
 290M foo.c
 291$ git update-index foo.c                         <5>
 292$ git diff --name-only                           <6>
 293$ edit foo.c
 294$ git diff --name-only                           <7>
 295$ git update-index --no-assume-unchanged foo.c   <8>
 296$ git diff --name-only                           <9>
 297M foo.c
 298------------
 299+
 300<1> forces lstat(2) to set "assume unchanged" bits for paths that match index.
 301<2> mark the path to be edited.
 302<3> this does lstat(2) and finds index matches the path.
 303<4> this does lstat(2) and finds index does *not* match the path.
 304<5> registering the new version to index sets "assume unchanged" bit.
 305<6> and it is assumed unchanged.
 306<7> even after you edit it.
 307<8> you can tell about the change after the fact.
 308<9> now it checks with lstat(2) and finds it has been changed.
 309
 310
 311Configuration
 312-------------
 313
 314The command honors `core.filemode` configuration variable.  If
 315your repository is on a filesystem whose executable bits are
 316unreliable, this should be set to 'false' (see linkgit:git-config[1]).
 317This causes the command to ignore differences in file modes recorded
 318in the index and the file mode on the filesystem if they differ only on
 319executable bit.   On such an unfortunate filesystem, you may
 320need to use 'git-update-index --chmod='.
 321
 322Quite similarly, if `core.symlinks` configuration variable is set
 323to 'false' (see linkgit:git-config[1]), symbolic links are checked out
 324as plain files, and this command does not modify a recorded file mode
 325from symbolic link to regular file.
 326
 327The command looks at `core.ignorestat` configuration variable.  See
 328'Using "assume unchanged" bit' section above.
 329
 330The command also looks at `core.trustctime` configuration variable.
 331It can be useful when the inode change time is regularly modified by
 332something outside Git (file system crawlers and backup systems use
 333ctime for marking files processed) (see linkgit:git-config[1]).
 334
 335
 336SEE ALSO
 337--------
 338linkgit:git-config[1],
 339linkgit:git-add[1]
 340
 341
 342Author
 343------
 344Written by Linus Torvalds <torvalds@osdl.org>
 345
 346Documentation
 347--------------
 348Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
 349
 350GIT
 351---
 352Part of the linkgit:git[1] suite