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