Documentation / git-update-index.txton commit repack: add --keep-pack option (ed7e5fc)
   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             [--[no-]assume-unchanged]
  18             [--[no-]skip-worktree]
  19             [--[no-]fsmonitor-valid]
  20             [--ignore-submodules]
  21             [--[no-]split-index]
  22             [--[no-|test-|force-]untracked-cache]
  23             [--[no-]fsmonitor]
  24             [--really-refresh] [--unresolve] [--again | -g]
  25             [--info-only] [--index-info]
  26             [-z] [--stdin] [--index-version <n>]
  27             [--verbose]
  28             [--] [<file>...]
  29
  30DESCRIPTION
  31-----------
  32Modifies the index or directory cache. Each file mentioned is updated
  33into the index and any 'unmerged' or 'needs updating' state is
  34cleared.
  35
  36See also linkgit:git-add[1] for a more user-friendly way to do some of
  37the most common operations on the index.
  38
  39The way 'git update-index' handles files it is told about can be modified
  40using the various options:
  41
  42OPTIONS
  43-------
  44--add::
  45        If a specified file isn't in the index already then it's
  46        added.
  47        Default behaviour is to ignore new files.
  48
  49--remove::
  50        If a specified file is in the index but is missing then it's
  51        removed.
  52        Default behavior is to ignore removed file.
  53
  54--refresh::
  55        Looks at the current index and checks to see if merges or
  56        updates are needed by checking stat() information.
  57
  58-q::
  59        Quiet.  If --refresh finds that the index needs an update, the
  60        default behavior is to error out.  This option makes
  61        'git update-index' continue anyway.
  62
  63--ignore-submodules::
  64        Do not try to update submodules.  This option is only respected
  65        when passed before --refresh.
  66
  67--unmerged::
  68        If --refresh finds unmerged changes in the index, the default
  69        behavior is to error out.  This option makes 'git update-index'
  70        continue anyway.
  71
  72--ignore-missing::
  73        Ignores missing files during a --refresh
  74
  75--cacheinfo <mode>,<object>,<path>::
  76--cacheinfo <mode> <object> <path>::
  77        Directly insert the specified info into the index.  For
  78        backward compatibility, you can also give these three
  79        arguments as three separate parameters, but new users are
  80        encouraged to use a single-parameter form.
  81
  82--index-info::
  83        Read index information from stdin.
  84
  85--chmod=(+|-)x::
  86        Set the execute permissions on the updated files.
  87
  88--[no-]assume-unchanged::
  89        When this flag is specified, the object names recorded
  90        for the paths are not updated.  Instead, this option
  91        sets/unsets the "assume unchanged" bit for the
  92        paths.  When the "assume unchanged" bit is on, the user
  93        promises not to change the file and allows Git to assume
  94        that the working tree file matches what is recorded in
  95        the index.  If you want to change the working tree file,
  96        you need to unset the bit to tell Git.  This is
  97        sometimes helpful when working with a big project on a
  98        filesystem that has very slow lstat(2) system call
  99        (e.g. cifs).
 100+
 101Git will fail (gracefully) in case it needs to modify this file
 102in the index e.g. when merging in a commit;
 103thus, in case the assumed-untracked file is changed upstream,
 104you will need to handle the situation manually.
 105
 106--really-refresh::
 107        Like `--refresh`, but checks stat information unconditionally,
 108        without regard to the "assume unchanged" setting.
 109
 110--[no-]skip-worktree::
 111        When one of these flags is specified, the object name recorded
 112        for the paths are not updated. Instead, these options
 113        set and unset the "skip-worktree" bit for the paths. See
 114        section "Skip-worktree bit" below for more information.
 115
 116--[no-]fsmonitor-valid::
 117        When one of these flags is specified, the object name recorded
 118        for the paths are not updated. Instead, these options
 119        set and unset the "fsmonitor valid" bit for the paths. See
 120        section "File System Monitor" below for more information.
 121
 122-g::
 123--again::
 124        Runs 'git update-index' itself on the paths whose index
 125        entries are different from those from the `HEAD` commit.
 126
 127--unresolve::
 128        Restores the 'unmerged' or 'needs updating' state of a
 129        file during a merge if it was cleared by accident.
 130
 131--info-only::
 132        Do not create objects in the object database for all
 133        <file> arguments that follow this flag; just insert
 134        their object IDs into the index.
 135
 136--force-remove::
 137        Remove the file from the index even when the working directory
 138        still has such a file. (Implies --remove.)
 139
 140--replace::
 141        By default, when a file `path` exists in the index,
 142        'git update-index' refuses an attempt to add `path/file`.
 143        Similarly if a file `path/file` exists, a file `path`
 144        cannot be added.  With --replace flag, existing entries
 145        that conflict with the entry being added are
 146        automatically removed with warning messages.
 147
 148--stdin::
 149        Instead of taking list of paths from the command line,
 150        read list of paths from the standard input.  Paths are
 151        separated by LF (i.e. one path per line) by default.
 152
 153--verbose::
 154        Report what is being added and removed from index.
 155
 156--index-version <n>::
 157        Write the resulting index out in the named on-disk format version.
 158        Supported versions are 2, 3 and 4. The current default version is 2
 159        or 3, depending on whether extra features are used, such as
 160        `git add -N`.
 161+
 162Version 4 performs a simple pathname compression that reduces index
 163size by 30%-50% on large repositories, which results in faster load
 164time. Version 4 is relatively young (first released in 1.8.0 in
 165October 2012). Other Git implementations such as JGit and libgit2
 166may not support it yet.
 167
 168-z::
 169        Only meaningful with `--stdin` or `--index-info`; paths are
 170        separated with NUL character instead of LF.
 171
 172--split-index::
 173--no-split-index::
 174        Enable or disable split index mode. If split-index mode is
 175        already enabled and `--split-index` is given again, all
 176        changes in $GIT_DIR/index are pushed back to the shared index
 177        file.
 178+
 179These options take effect whatever the value of the `core.splitIndex`
 180configuration variable (see linkgit:git-config[1]). But a warning is
 181emitted when the change goes against the configured value, as the
 182configured value will take effect next time the index is read and this
 183will remove the intended effect of the option.
 184
 185--untracked-cache::
 186--no-untracked-cache::
 187        Enable or disable untracked cache feature. Please use
 188        `--test-untracked-cache` before enabling it.
 189+
 190These options take effect whatever the value of the `core.untrackedCache`
 191configuration variable (see linkgit:git-config[1]). But a warning is
 192emitted when the change goes against the configured value, as the
 193configured value will take effect next time the index is read and this
 194will remove the intended effect of the option.
 195
 196--test-untracked-cache::
 197        Only perform tests on the working directory to make sure
 198        untracked cache can be used. You have to manually enable
 199        untracked cache using `--untracked-cache` or
 200        `--force-untracked-cache` or the `core.untrackedCache`
 201        configuration variable afterwards if you really want to use
 202        it. If a test fails the exit code is 1 and a message
 203        explains what is not working as needed, otherwise the exit
 204        code is 0 and OK is printed.
 205
 206--force-untracked-cache::
 207        Same as `--untracked-cache`. Provided for backwards
 208        compatibility with older versions of Git where
 209        `--untracked-cache` used to imply `--test-untracked-cache` but
 210        this option would enable the extension unconditionally.
 211
 212--fsmonitor::
 213--no-fsmonitor::
 214        Enable or disable files system monitor feature. These options
 215        take effect whatever the value of the `core.fsmonitor`
 216        configuration variable (see linkgit:git-config[1]). But a warning
 217        is emitted when the change goes against the configured value, as
 218        the configured value will take effect next time the index is
 219        read and this will remove the intended effect of the option.
 220
 221\--::
 222        Do not interpret any more arguments as options.
 223
 224<file>::
 225        Files to act on.
 226        Note that files beginning with '.' are discarded. This includes
 227        `./file` and `dir/./file`. If you don't want this, then use
 228        cleaner names.
 229        The same applies to directories ending '/' and paths with '//'
 230
 231Using --refresh
 232---------------
 233`--refresh` does not calculate a new sha1 file or bring the index
 234up to date for mode/content changes. But what it *does* do is to
 235"re-match" the stat information of a file with the index, so that you
 236can refresh the index for a file that hasn't been changed but where
 237the stat entry is out of date.
 238
 239For example, you'd want to do this after doing a 'git read-tree', to link
 240up the stat index details with the proper files.
 241
 242Using --cacheinfo or --info-only
 243--------------------------------
 244`--cacheinfo` is used to register a file that is not in the
 245current working directory.  This is useful for minimum-checkout
 246merging.
 247
 248To pretend you have a file with mode and sha1 at path, say:
 249
 250----------------
 251$ git update-index --cacheinfo <mode>,<sha1>,<path>
 252----------------
 253
 254`--info-only` is used to register files without placing them in the object
 255database.  This is useful for status-only repositories.
 256
 257Both `--cacheinfo` and `--info-only` behave similarly: the index is updated
 258but the object database isn't.  `--cacheinfo` is useful when the object is
 259in the database but the file isn't available locally.  `--info-only` is
 260useful when the file is available, but you do not wish to update the
 261object database.
 262
 263
 264Using --index-info
 265------------------
 266
 267`--index-info` is a more powerful mechanism that lets you feed
 268multiple entry definitions from the standard input, and designed
 269specifically for scripts.  It can take inputs of three formats:
 270
 271    . mode         SP sha1          TAB path
 272+
 273The first format is what "git-apply --index-info"
 274reports, and used to reconstruct a partial tree
 275that is used for phony merge base tree when falling
 276back on 3-way merge.
 277
 278    . mode SP type SP sha1          TAB path
 279+
 280The second format is to stuff 'git ls-tree' output
 281into the index file.
 282
 283    . mode         SP sha1 SP stage TAB path
 284+
 285This format is to put higher order stages into the
 286index file and matches 'git ls-files --stage' output.
 287
 288To place a higher stage entry to the index, the path should
 289first be removed by feeding a mode=0 entry for the path, and
 290then feeding necessary input lines in the third format.
 291
 292For example, starting with this index:
 293
 294------------
 295$ git ls-files -s
 296100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0       frotz
 297------------
 298
 299you can feed the following input to `--index-info`:
 300
 301------------
 302$ git update-index --index-info
 3030 0000000000000000000000000000000000000000      frotz
 304100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1       frotz
 305100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2       frotz
 306------------
 307
 308The first line of the input feeds 0 as the mode to remove the
 309path; the SHA-1 does not matter as long as it is well formatted.
 310Then the second and third line feeds stage 1 and stage 2 entries
 311for that path.  After the above, we would end up with this:
 312
 313------------
 314$ git ls-files -s
 315100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1       frotz
 316100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2       frotz
 317------------
 318
 319
 320Using ``assume unchanged'' bit
 321------------------------------
 322
 323Many operations in Git depend on your filesystem to have an
 324efficient `lstat(2)` implementation, so that `st_mtime`
 325information for working tree files can be cheaply checked to see
 326if the file contents have changed from the version recorded in
 327the index file.  Unfortunately, some filesystems have
 328inefficient `lstat(2)`.  If your filesystem is one of them, you
 329can set "assume unchanged" bit to paths you have not changed to
 330cause Git not to do this check.  Note that setting this bit on a
 331path does not mean Git will check the contents of the file to
 332see if it has changed -- it makes Git to omit any checking and
 333assume it has *not* changed.  When you make changes to working
 334tree files, you have to explicitly tell Git about it by dropping
 335"assume unchanged" bit, either before or after you modify them.
 336
 337In order to set "assume unchanged" bit, use `--assume-unchanged`
 338option.  To unset, use `--no-assume-unchanged`. To see which files
 339have the "assume unchanged" bit set, use `git ls-files -v`
 340(see linkgit:git-ls-files[1]).
 341
 342The command looks at `core.ignorestat` configuration variable.  When
 343this is true, paths updated with `git update-index paths...` and
 344paths updated with other Git commands that update both index and
 345working tree (e.g. 'git apply --index', 'git checkout-index -u',
 346and 'git read-tree -u') are automatically marked as "assume
 347unchanged".  Note that "assume unchanged" bit is *not* set if
 348`git update-index --refresh` finds the working tree file matches
 349the index (use `git update-index --really-refresh` if you want
 350to mark them as "assume unchanged").
 351
 352
 353Examples
 354--------
 355To update and refresh only the files already checked out:
 356
 357----------------
 358$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
 359----------------
 360
 361On an inefficient filesystem with `core.ignorestat` set::
 362+
 363------------
 364$ git update-index --really-refresh              <1>
 365$ git update-index --no-assume-unchanged foo.c   <2>
 366$ git diff --name-only                           <3>
 367$ edit foo.c
 368$ git diff --name-only                           <4>
 369M foo.c
 370$ git update-index foo.c                         <5>
 371$ git diff --name-only                           <6>
 372$ edit foo.c
 373$ git diff --name-only                           <7>
 374$ git update-index --no-assume-unchanged foo.c   <8>
 375$ git diff --name-only                           <9>
 376M foo.c
 377------------
 378+
 379<1> forces lstat(2) to set "assume unchanged" bits for paths that match index.
 380<2> mark the path to be edited.
 381<3> this does lstat(2) and finds index matches the path.
 382<4> this does lstat(2) and finds index does *not* match the path.
 383<5> registering the new version to index sets "assume unchanged" bit.
 384<6> and it is assumed unchanged.
 385<7> even after you edit it.
 386<8> you can tell about the change after the fact.
 387<9> now it checks with lstat(2) and finds it has been changed.
 388
 389
 390Skip-worktree bit
 391-----------------
 392
 393Skip-worktree bit can be defined in one (long) sentence: When reading
 394an entry, if it is marked as skip-worktree, then Git pretends its
 395working directory version is up to date and read the index version
 396instead.
 397
 398To elaborate, "reading" means checking for file existence, reading
 399file attributes or file content. The working directory version may be
 400present or absent. If present, its content may match against the index
 401version or not. Writing is not affected by this bit, content safety
 402is still first priority. Note that Git _can_ update working directory
 403file, that is marked skip-worktree, if it is safe to do so (i.e.
 404working directory version matches index version)
 405
 406Although this bit looks similar to assume-unchanged bit, its goal is
 407different from assume-unchanged bit's. Skip-worktree also takes
 408precedence over assume-unchanged bit when both are set.
 409
 410Split index
 411-----------
 412
 413This mode is designed for repositories with very large indexes, and
 414aims at reducing the time it takes to repeatedly write these indexes.
 415
 416In this mode, the index is split into two files, $GIT_DIR/index and
 417$GIT_DIR/sharedindex.<SHA-1>. Changes are accumulated in
 418$GIT_DIR/index, the split index, while the shared index file contains
 419all index entries and stays unchanged.
 420
 421All changes in the split index are pushed back to the shared index
 422file when the number of entries in the split index reaches a level
 423specified by the splitIndex.maxPercentChange config variable (see
 424linkgit:git-config[1]).
 425
 426Each time a new shared index file is created, the old shared index
 427files are deleted if their modification time is older than what is
 428specified by the splitIndex.sharedIndexExpire config variable (see
 429linkgit:git-config[1]).
 430
 431To avoid deleting a shared index file that is still used, its
 432modification time is updated to the current time everytime a new split
 433index based on the shared index file is either created or read from.
 434
 435Untracked cache
 436---------------
 437
 438This cache is meant to speed up commands that involve determining
 439untracked files such as `git status`.
 440
 441This feature works by recording the mtime of the working tree
 442directories and then omitting reading directories and stat calls
 443against files in those directories whose mtime hasn't changed. For
 444this to work the underlying operating system and file system must
 445change the `st_mtime` field of directories if files in the directory
 446are added, modified or deleted.
 447
 448You can test whether the filesystem supports that with the
 449`--test-untracked-cache` option. The `--untracked-cache` option used
 450to implicitly perform that test in older versions of Git, but that's
 451no longer the case.
 452
 453If you want to enable (or disable) this feature, it is easier to use
 454the `core.untrackedCache` configuration variable (see
 455linkgit:git-config[1]) than using the `--untracked-cache` option to
 456`git update-index` in each repository, especially if you want to do so
 457across all repositories you use, because you can set the configuration
 458variable to `true` (or `false`) in your `$HOME/.gitconfig` just once
 459and have it affect all repositories you touch.
 460
 461When the `core.untrackedCache` configuration variable is changed, the
 462untracked cache is added to or removed from the index the next time a
 463command reads the index; while when `--[no-|force-]untracked-cache`
 464are used, the untracked cache is immediately added to or removed from
 465the index.
 466
 467Before 2.17, the untracked cache had a bug where replacing a directory
 468with a symlink to another directory could cause it to incorrectly show
 469files tracked by git as untracked. See the "status: add a failing test
 470showing a core.untrackedCache bug" commit to git.git. A workaround for
 471that is (and this might work for other undiscovered bugs in the
 472future):
 473
 474----------------
 475$ git -c core.untrackedCache=false status
 476----------------
 477
 478This bug has also been shown to affect non-symlink cases of replacing
 479a directory with a file when it comes to the internal structures of
 480the untracked cache, but no case has been reported where this resulted in
 481wrong "git status" output.
 482
 483There are also cases where existing indexes written by git versions
 484before 2.17 will reference directories that don't exist anymore,
 485potentially causing many "could not open directory" warnings to be
 486printed on "git status". These are new warnings for existing issues
 487that were previously silently discarded.
 488
 489As with the bug described above the solution is to one-off do a "git
 490status" run with `core.untrackedCache=false` to flush out the leftover
 491bad data.
 492
 493File System Monitor
 494-------------------
 495
 496This feature is intended to speed up git operations for repos that have
 497large working directories.
 498
 499It enables git to work together with a file system monitor (see the
 500"fsmonitor-watchman" section of linkgit:githooks[5]) that can
 501inform it as to what files have been modified. This enables git to avoid
 502having to lstat() every file to find modified files.
 503
 504When used in conjunction with the untracked cache, it can further improve
 505performance by avoiding the cost of scanning the entire working directory
 506looking for new files.
 507
 508If you want to enable (or disable) this feature, it is easier to use
 509the `core.fsmonitor` configuration variable (see
 510linkgit:git-config[1]) than using the `--fsmonitor` option to
 511`git update-index` in each repository, especially if you want to do so
 512across all repositories you use, because you can set the configuration
 513variable in your `$HOME/.gitconfig` just once and have it affect all
 514repositories you touch.
 515
 516When the `core.fsmonitor` configuration variable is changed, the
 517file system monitor is added to or removed from the index the next time
 518a command reads the index. When `--[no-]fsmonitor` are used, the file
 519system monitor is immediately added to or removed from the index.
 520
 521Configuration
 522-------------
 523
 524The command honors `core.filemode` configuration variable.  If
 525your repository is on a filesystem whose executable bits are
 526unreliable, this should be set to 'false' (see linkgit:git-config[1]).
 527This causes the command to ignore differences in file modes recorded
 528in the index and the file mode on the filesystem if they differ only on
 529executable bit.   On such an unfortunate filesystem, you may
 530need to use 'git update-index --chmod='.
 531
 532Quite similarly, if `core.symlinks` configuration variable is set
 533to 'false' (see linkgit:git-config[1]), symbolic links are checked out
 534as plain files, and this command does not modify a recorded file mode
 535from symbolic link to regular file.
 536
 537The command looks at `core.ignorestat` configuration variable.  See
 538'Using "assume unchanged" bit' section above.
 539
 540The command also looks at `core.trustctime` configuration variable.
 541It can be useful when the inode change time is regularly modified by
 542something outside Git (file system crawlers and backup systems use
 543ctime for marking files processed) (see linkgit:git-config[1]).
 544
 545The untracked cache extension can be enabled by the
 546`core.untrackedCache` configuration variable (see
 547linkgit:git-config[1]).
 548
 549SEE ALSO
 550--------
 551linkgit:git-config[1],
 552linkgit:git-add[1],
 553linkgit:git-ls-files[1]
 554
 555GIT
 556---
 557Part of the linkgit:git[1] suite