|  | Git index format | 
|  | ================ | 
|  |  | 
|  | == The Git index file has the following format | 
|  |  | 
|  | All binary numbers are in network byte order. Version 2 is described | 
|  | here unless stated otherwise. | 
|  |  | 
|  | - A 12-byte header consisting of | 
|  |  | 
|  | 4-byte signature: | 
|  | The signature is { 'D', 'I', 'R', 'C' } (stands for "dircache") | 
|  |  | 
|  | 4-byte version number: | 
|  | The current supported versions are 2, 3 and 4. | 
|  |  | 
|  | 32-bit number of index entries. | 
|  |  | 
|  | - A number of sorted index entries (see below). | 
|  |  | 
|  | - Extensions | 
|  |  | 
|  | Extensions are identified by signature. Optional extensions can | 
|  | be ignored if Git does not understand them. | 
|  |  | 
|  | Git currently supports cached tree and resolve undo extensions. | 
|  |  | 
|  | 4-byte extension signature. If the first byte is 'A'..'Z' the | 
|  | extension is optional and can be ignored. | 
|  |  | 
|  | 32-bit size of the extension | 
|  |  | 
|  | Extension data | 
|  |  | 
|  | - 160-bit SHA-1 over the content of the index file before this | 
|  | checksum. | 
|  |  | 
|  | == Index entry | 
|  |  | 
|  | Index entries are sorted in ascending order on the name field, | 
|  | interpreted as a string of unsigned bytes (i.e. memcmp() order, no | 
|  | localization, no special casing of directory separator '/'). Entries | 
|  | with the same name are sorted by their stage field. | 
|  |  | 
|  | 32-bit ctime seconds, the last time a file's metadata changed | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit ctime nanosecond fractions | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit mtime seconds, the last time a file's data changed | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit mtime nanosecond fractions | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit dev | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit ino | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit mode, split into (high to low bits) | 
|  |  | 
|  | 4-bit object type | 
|  | valid values in binary are 1000 (regular file), 1010 (symbolic link) | 
|  | and 1110 (gitlink) | 
|  |  | 
|  | 3-bit unused | 
|  |  | 
|  | 9-bit unix permission. Only 0755 and 0644 are valid for regular files. | 
|  | Symbolic links and gitlinks have value 0 in this field. | 
|  |  | 
|  | 32-bit uid | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit gid | 
|  | this is stat(2) data | 
|  |  | 
|  | 32-bit file size | 
|  | This is the on-disk size from stat(2), truncated to 32-bit. | 
|  |  | 
|  | 160-bit SHA-1 for the represented object | 
|  |  | 
|  | A 16-bit 'flags' field split into (high to low bits) | 
|  |  | 
|  | 1-bit assume-valid flag | 
|  |  | 
|  | 1-bit extended flag (must be zero in version 2) | 
|  |  | 
|  | 2-bit stage (during merge) | 
|  |  | 
|  | 12-bit name length if the length is less than 0xFFF; otherwise 0xFFF | 
|  | is stored in this field. | 
|  |  | 
|  | (Version 3 or later) A 16-bit field, only applicable if the | 
|  | "extended flag" above is 1, split into (high to low bits). | 
|  |  | 
|  | 1-bit reserved for future | 
|  |  | 
|  | 1-bit skip-worktree flag (used by sparse checkout) | 
|  |  | 
|  | 1-bit intent-to-add flag (used by "git add -N") | 
|  |  | 
|  | 13-bit unused, must be zero | 
|  |  | 
|  | Entry path name (variable length) relative to top level directory | 
|  | (without leading slash). '/' is used as path separator. The special | 
|  | path components ".", ".." and ".git" (without quotes) are disallowed. | 
|  | Trailing slash is also disallowed. | 
|  |  | 
|  | The exact encoding is undefined, but the '.' and '/' characters | 
|  | are encoded in 7-bit ASCII and the encoding cannot contain a NUL | 
|  | byte (iow, this is a UNIX pathname). | 
|  |  | 
|  | (Version 4) In version 4, the entry path name is prefix-compressed | 
|  | relative to the path name for the previous entry (the very first | 
|  | entry is encoded as if the path name for the previous entry is an | 
|  | empty string).  At the beginning of an entry, an integer N in the | 
|  | variable width encoding (the same encoding as the offset is encoded | 
|  | for OFS_DELTA pack entries; see pack-format.txt) is stored, followed | 
|  | by a NUL-terminated string S.  Removing N bytes from the end of the | 
|  | path name for the previous entry, and replacing it with the string S | 
|  | yields the path name for this entry. | 
|  |  | 
|  | 1-8 nul bytes as necessary to pad the entry to a multiple of eight bytes | 
|  | while keeping the name NUL-terminated. | 
|  |  | 
|  | (Version 4) In version 4, the padding after the pathname does not | 
|  | exist. | 
|  |  | 
|  | Interpretation of index entries in split index mode is completely | 
|  | different. See below for details. | 
|  |  | 
|  | == Extensions | 
|  |  | 
|  | === Cached tree | 
|  |  | 
|  | Cached tree extension contains pre-computed hashes for trees that can | 
|  | be derived from the index. It helps speed up tree object generation | 
|  | from index for a new commit. | 
|  |  | 
|  | When a path is updated in index, the path must be invalidated and | 
|  | removed from tree cache. | 
|  |  | 
|  | The signature for this extension is { 'T', 'R', 'E', 'E' }. | 
|  |  | 
|  | A series of entries fill the entire extension; each of which | 
|  | consists of: | 
|  |  | 
|  | - NUL-terminated path component (relative to its parent directory); | 
|  |  | 
|  | - ASCII decimal number of entries in the index that is covered by the | 
|  | tree this entry represents (entry_count); | 
|  |  | 
|  | - A space (ASCII 32); | 
|  |  | 
|  | - ASCII decimal number that represents the number of subtrees this | 
|  | tree has; | 
|  |  | 
|  | - A newline (ASCII 10); and | 
|  |  | 
|  | - 160-bit object name for the object that would result from writing | 
|  | this span of index as a tree. | 
|  |  | 
|  | An entry can be in an invalidated state and is represented by having | 
|  | a negative number in the entry_count field. In this case, there is no | 
|  | object name and the next entry starts immediately after the newline. | 
|  | When writing an invalid entry, -1 should always be used as entry_count. | 
|  |  | 
|  | The entries are written out in the top-down, depth-first order.  The | 
|  | first entry represents the root level of the repository, followed by the | 
|  | first subtree--let's call this A--of the root level (with its name | 
|  | relative to the root level), followed by the first subtree of A (with | 
|  | its name relative to A), ... | 
|  |  | 
|  | === Resolve undo | 
|  |  | 
|  | A conflict is represented in the index as a set of higher stage entries. | 
|  | When a conflict is resolved (e.g. with "git add path"), these higher | 
|  | stage entries will be removed and a stage-0 entry with proper resolution | 
|  | is added. | 
|  |  | 
|  | When these higher stage entries are removed, they are saved in the | 
|  | resolve undo extension, so that conflicts can be recreated (e.g. with | 
|  | "git checkout -m"), in case users want to redo a conflict resolution | 
|  | from scratch. | 
|  |  | 
|  | The signature for this extension is { 'R', 'E', 'U', 'C' }. | 
|  |  | 
|  | A series of entries fill the entire extension; each of which | 
|  | consists of: | 
|  |  | 
|  | - NUL-terminated pathname the entry describes (relative to the root of | 
|  | the repository, i.e. full pathname); | 
|  |  | 
|  | - Three NUL-terminated ASCII octal numbers, entry mode of entries in | 
|  | stage 1 to 3 (a missing stage is represented by "0" in this field); | 
|  | and | 
|  |  | 
|  | - At most three 160-bit object names of the entry in stages from 1 to 3 | 
|  | (nothing is written for a missing stage). | 
|  |  | 
|  | === Split index | 
|  |  | 
|  | In split index mode, the majority of index entries could be stored | 
|  | in a separate file. This extension records the changes to be made on | 
|  | top of that to produce the final index. | 
|  |  | 
|  | The signature for this extension is { 'l', 'i', 'n', 'k' }. | 
|  |  | 
|  | The extension consists of: | 
|  |  | 
|  | - 160-bit SHA-1 of the shared index file. The shared index file path | 
|  | is $GIT_DIR/sharedindex.<SHA-1>. If all 160 bits are zero, the | 
|  | index does not require a shared index file. | 
|  |  | 
|  | - An ewah-encoded delete bitmap, each bit represents an entry in the | 
|  | shared index. If a bit is set, its corresponding entry in the | 
|  | shared index will be removed from the final index.  Note, because | 
|  | a delete operation changes index entry positions, but we do need | 
|  | original positions in replace phase, it's best to just mark | 
|  | entries for removal, then do a mass deletion after replacement. | 
|  |  | 
|  | - An ewah-encoded replace bitmap, each bit represents an entry in | 
|  | the shared index. If a bit is set, its corresponding entry in the | 
|  | shared index will be replaced with an entry in this index | 
|  | file. All replaced entries are stored in sorted order in this | 
|  | index. The first "1" bit in the replace bitmap corresponds to the | 
|  | first index entry, the second "1" bit to the second entry and so | 
|  | on. Replaced entries may have empty path names to save space. | 
|  |  | 
|  | The remaining index entries after replaced ones will be added to the | 
|  | final index. These added entries are also sorted by entry name then | 
|  | stage. | 
|  |  | 
|  | == Untracked cache | 
|  |  | 
|  | Untracked cache saves the untracked file list and necessary data to | 
|  | verify the cache. The signature for this extension is { 'U', 'N', | 
|  | 'T', 'R' }. | 
|  |  | 
|  | The extension starts with | 
|  |  | 
|  | - A sequence of NUL-terminated strings, preceded by the size of the | 
|  | sequence in variable width encoding. Each string describes the | 
|  | environment where the cache can be used. | 
|  |  | 
|  | - Stat data of $GIT_DIR/info/exclude. See "Index entry" section from | 
|  | ctime field until "file size". | 
|  |  | 
|  | - Stat data of core.excludesfile | 
|  |  | 
|  | - 32-bit dir_flags (see struct dir_struct) | 
|  |  | 
|  | - 160-bit SHA-1 of $GIT_DIR/info/exclude. Null SHA-1 means the file | 
|  | does not exist. | 
|  |  | 
|  | - 160-bit SHA-1 of core.excludesfile. Null SHA-1 means the file does | 
|  | not exist. | 
|  |  | 
|  | - NUL-terminated string of per-dir exclude file name. This usually | 
|  | is ".gitignore". | 
|  |  | 
|  | - The number of following directory blocks, variable width | 
|  | encoding. If this number is zero, the extension ends here with a | 
|  | following NUL. | 
|  |  | 
|  | - A number of directory blocks in depth-first-search order, each | 
|  | consists of | 
|  |  | 
|  | - The number of untracked entries, variable width encoding. | 
|  |  | 
|  | - The number of sub-directory blocks, variable width encoding. | 
|  |  | 
|  | - The directory name terminated by NUL. | 
|  |  | 
|  | - A number of untracked file/dir names terminated by NUL. | 
|  |  | 
|  | The remaining data of each directory block is grouped by type: | 
|  |  | 
|  | - An ewah bitmap, the n-th bit marks whether the n-th directory has | 
|  | valid untracked cache entries. | 
|  |  | 
|  | - An ewah bitmap, the n-th bit records "check-only" bit of | 
|  | read_directory_recursive() for the n-th directory. | 
|  |  | 
|  | - An ewah bitmap, the n-th bit indicates whether SHA-1 and stat data | 
|  | is valid for the n-th directory and exists in the next data. | 
|  |  | 
|  | - An array of stat data. The n-th data corresponds with the n-th | 
|  | "one" bit in the previous ewah bitmap. | 
|  |  | 
|  | - An array of SHA-1. The n-th SHA-1 corresponds with the n-th "one" bit | 
|  | in the previous ewah bitmap. | 
|  |  | 
|  | - One NUL. |