89e410a8b242ef788abab4501f46fed149315357
   1GIT index format
   2================
   3
   4= The git index file has the following format
   5
   6  All binary numbers are in network byte order. Version 2 is described
   7  here unless stated otherwise.
   8
   9   - A 12-byte header consisting of
  10
  11     4-byte signature:
  12       The signature is { 'D', 'I', 'R', 'C' }
  13
  14     4-byte version number:
  15       The current supported versions are 2 and 3.
  16
  17     32-bit number of index entries.
  18
  19   - A number of sorted index entries
  20
  21   - Extensions
  22
  23     Extensions are identified by signature. Optional extensions can
  24     be ignored if GIT does not understand them.
  25
  26     GIT currently supports tree cache and resolve undo extensions.
  27
  28     4-byte extension signature. If the first byte is 'A'..'Z' the
  29     extension is optional and can be ignored.
  30
  31     32-bit size of the extension
  32
  33     Extension data
  34
  35   - 160-bit SHA-1 over the content of the index file before this
  36     checksum.
  37
  38== Index entry
  39
  40  Index entries are sorted in ascending order on the name field,
  41  interpreted as a string of unsigned bytes. Entries with the same
  42  name are sorted by their stage field.
  43
  44  32-bit ctime seconds, the last time a file's metadata changed
  45    this is stat(2) data
  46
  47  32-bit ctime nanosecond fractions
  48    this is stat(2) data
  49
  50  32-bit mtime seconds, the last time a file's data changed
  51    this is stat(2) data
  52
  53  32-bit mtime nanosecond fractions
  54    this is stat(2) data
  55
  56  32-bit dev
  57    this is stat(2) data
  58
  59  32-bit ino
  60    this is stat(2) data
  61
  62  32-bit mode, split into (high to low bits)
  63
  64    4-bit object type
  65      valid values in binary are 1000 (blob), 1010 (symbolic link)
  66      and 1110 (gitlink)
  67
  68    3-bit unused
  69
  70    9-bit unix permission (only 0755 and 0644 are valid)
  71
  72  32-bit uid
  73    this is stat(2) data
  74
  75  32-bit gid
  76    this is stat(2) data
  77
  78  32-bit file size
  79    This is the on-disk size from stat(2)
  80
  81  160-bit SHA-1 for the represented object
  82
  83  A 16-bit field split into (high to low bits)
  84
  85    1-bit assume-valid flag
  86
  87    1-bit extended flag (must be zero in version 2)
  88
  89    2-bit stage (during merge)
  90
  91    12-bit name length if the length is less than 0x0FFF
  92
  93  (Version 3) A 16-bit field, only applicable if the "extended flag"
  94  above is 1, split into (high to low bits).
  95
  96    1-bit reserved for future
  97
  98    1-bit skip-worktree flag (used by sparse checkout)
  99
 100    1-bit intent-to-add flag (used by "git add -N")
 101
 102    13-bit unused, must be zero
 103
 104  Entry path name (variable length) relative to top level directory
 105    (without leading slash). '/' is used as path separator. The special
 106    paths ".", ".." and ".git" (without quotes) are disallowed.
 107    Trailing slash is also disallowed.
 108
 109    The exact encoding is undefined, but the '.' and '/' characters
 110    are encoded in 7-bit ASCII and the encoding cannot contain a nul
 111    byte. Generally a superset of ASCII.
 112
 113  1-8 nul bytes as necessary to pad the entry to a multiple of eight bytes
 114  while keeping the name NUL-terminated.
 115
 116== Extensions
 117
 118=== Tree cache
 119
 120  Tree cache extension contains pre-computed hashes for trees that can
 121  be derived from the index. It helps speed up tree object generation
 122  from index for a new commit.
 123
 124  When a path is updated in index, the path must be invalidated and
 125  removed from tree cache.
 126
 127  - Extension tag { 'T', 'R', 'E', 'E' }
 128
 129  - 32-bit size
 130
 131  - A number of entries
 132
 133     NUL-terminated tree name
 134
 135     Blank-terminated ASCII decimal number of entries in this tree
 136
 137     Newline-terminated position of this tree in the parent tree. 0 for
 138     the root tree
 139
 140     160-bit SHA-1 for this tree and it's children
 141
 142=== Resolve undo
 143
 144  A conflict is represented in index as a set of higher stage entries.
 145  When a conflict is resolved (e.g. with "git add path"), these higher
 146  stage entries will be removed and a stage-0 entry with proper
 147  resoluton is added.
 148
 149  Resolve undo extension saves these higher stage entries so that
 150  conflicts can be recreated (e.g. with "git checkout -m"), in case
 151  users want to redo a conflict resolution from scratch.
 152
 153  - Extension tag { 'R', 'E', 'U', 'C' }
 154
 155  - 32-bit size
 156
 157  - A number of conflict entries
 158
 159    NUL-terminated conflict path
 160
 161    Three NUL-terminated ASCII octal numbers, entry mode of entries in
 162    stage 1 to 3.
 163
 164    At most three 160-bit SHA-1s of the entry in three stages from 1
 165    to 3. SHA-1 is not saved for any stage with entry mode zero.