Spec-Zone.ru › Git

git-update-index

Название

git-update-index — регистрация содержимого файлов рабочего дерева в индексе

Краткое описание

git update-index
             [--add] [--remove | --force-remove] [--replace]
             [--refresh] [-q] [--unmerged] [--ignore-missing]
             [(--cacheinfo <mode>,<object>,<file>)…​]
             [--chmod=(+|-)x]
             [--[no-]assume-unchanged]
             [--[no-]skip-worktree]
             [--[no-]ignore-skip-worktree-entries]
             [--[no-]fsmonitor-valid]
             [--ignore-submodules]
             [--[no-]split-index]
             [--[no-|test-|force-]untracked-cache]
             [--[no-]fsmonitor]
             [--really-refresh] [--unresolve] [--again | -g]
             [--info-only] [--index-info]
             [-z] [--stdin] [--index-version <n>]
             [--show-index-version]
             [--verbose]
             [--] [<file>…​]

Описание

Изменяет индекс. Каждый указанный файл обновляется в индексе, а состояние unmerged или needs updating сбрасывается.

См. также git-add[1] — более удобный для пользователя способ выполнения некоторых наиболее распространённых операций с индексом.

Способ обработки файлов, о которых сообщается команде git update-index, можно изменить с помощью различных параметров:

Параметры

--add

Если указанного файла ещё нет в индексе, он добавляется. По умолчанию новые файлы игнорируются.

--remove

Если указанный файл есть в индексе, но отсутствует, он удаляется. По умолчанию удалённые файлы игнорируются.

--refresh

Проверяет текущий индекс и определяет по информации stat(), нужны ли слияния или обновления.

-q

Без вывода сообщений. Если параметр --refresh обнаруживает, что индекс нужно обновить, по умолчанию команда завершается с ошибкой. Этот параметр позволяет git update-index продолжить выполнение.

--ignore-submodules

Не пытаться обновлять подмодули. Этот параметр учитывается только в том случае, если он указан перед --refresh.

--unmerged

Если параметр --refresh обнаруживает в индексе неслитые изменения, по умолчанию команда завершается с ошибкой. Этот параметр позволяет git update-index продолжить выполнение.

--ignore-missing

Игнорирует отсутствующие файлы при выполнении --refresh

--cacheinfo <mode>,<object>,<path>
--cacheinfo <mode> <object> <path>

Непосредственно вставляет указанную информацию в индекс. Для обратной совместимости эти три аргумента также можно указать как три отдельных параметра, но новым пользователям рекомендуется использовать форму с одним параметром.

--index-info

Читает информацию об индексе из стандартного ввода.

--chmod=(+|-)x

Устанавливает права на выполнение для обновлённых файлов.

--assume-unchanged
--no-assume-unchanged

Если указан этот флаг, имена объектов, записанные для путей, не обновляются. Вместо этого этот параметр устанавливает или сбрасывает для путей бит «считать неизменённым». Когда этот бит установлен, пользователь обещает не изменять файл, и Git может считать, что файл в рабочем дереве соответствует записи в индексе. Если вы хотите изменить файл в рабочем дереве, необходимо сбросить этот бит, чтобы сообщить об этом Git. Это иногда полезно при работе с большим проектом в файловой системе, где системный вызов lstat(2) выполняется очень медленно (например, cifs).

Git корректно завершится с ошибкой, если ему потребуется изменить этот файл в индексе, например при слиянии коммита; поэтому, если файл, считающийся неизменённым, изменён в вышестоящей ветке, ситуацию придётся обработать вручную.

--really-refresh

Подобно --refresh, но безусловно проверяет информацию stat(), независимо от настройки «считать неизменённым».

--skip-worktree
--no-skip-worktree

Если указан один из этих флагов, имена объектов, записанные для путей, не обновляются. Вместо этого эти параметры устанавливают или сбрасывают для путей бит «пропустить рабочее дерево». Дополнительные сведения см. ниже в разделе «Бит skip-worktree».

--ignore-skip-worktree-entries
--no-ignore-skip-worktree-entries

Не удалять записи skip-worktree (также называемые «только в индексе»), даже если указан параметр --remove.

--fsmonitor-valid
--no-fsmonitor-valid

Если указан один из этих флагов, имена объектов, записанные для путей, не обновляются. Вместо этого эти параметры устанавливают или сбрасывают для путей бит «действителен для fsmonitor». Дополнительные сведения см. ниже в разделе «Монитор файловой системы».

-g
--again

Запускает git update-index для путей, записи которых в индексе отличаются от записей коммита HEAD.

--unresolve

Восстанавливает состояние unmerged или needs updating файла во время слияния, если оно было сброшено по ошибке.

--info-only

Не создавать объекты в базе объектов для всех аргументов <file>, указанных после этого флага; только вставить их идентификаторы объектов в индекс.

--force-remove

Удалить файл из индекса, даже если такой файл всё ещё существует в рабочем каталоге. (Подразумевает --remove.)

--replace

По умолчанию, если файл path есть в индексе, git update-index отказывается добавлять path/file. Аналогично, если файл path/file есть в индексе, файл path добавить нельзя. При указании флага --replace существующие записи, конфликтующие с добавляемой записью, автоматически удаляются с предупреждениями.

--stdin

Вместо списка путей из командной строки считывать список путей из стандартного ввода. По умолчанию пути разделяются символом LF (то есть один путь на строку).

--verbose

Сообщать о том, что добавляется в индекс и удаляется из него.

--index-version <n>

Записать итоговый индекс в указанном формате on-disk. Поддерживаются версии 2, 3 и 4. Текущая версия по умолчанию — 2 или 3, в зависимости от использования дополнительных возможностей, таких как git add -N. При использовании --verbose также вывести версию файла индекса до и после выполнения этой команды.

Версия 4 использует простое сжатие имён путей, которое уменьшает размер индекса в крупных репозиториях на 30–50 % и ускоряет загрузку. Git поддерживает её начиная с версии 1.8.0, выпущенной в октябре 2012 года; поддержка была добавлена в libgit2 в 2016 году, а в JGit — в 2020 году. В более ранних версиях этой страницы руководства она называлась «относительно новой», но сегодня её следует считать зрелой технологией.

--show-index-version

Вывести версию формата индекса, используемую файлом индекса на диске. См. --index-version выше.

-z

Имеет смысл только с --stdin или --index-info; пути разделяются символом NUL вместо LF.

--split-index
--no-split-index

Включить или отключить режим разделённого индекса. Если режим разделённого индекса уже включён и параметр --split-index указан повторно, все изменения в $GIT_DIR/index переносятся обратно в общий файл индекса.

Эти параметры действуют независимо от значения переменной конфигурации core.splitIndex (см. git-config[1]). Однако, если изменение противоречит настроенному значению, выводится предупреждение: настроенное значение вступит в силу при следующем чтении индекса и отменит предполагаемый эффект параметра.

--untracked-cache
--no-untracked-cache

Включить или отключить функцию кэширования неотслеживаемых файлов. Перед её включением воспользуйтесь параметром --test-untracked-cache.

Эти параметры действуют независимо от значения переменной конфигурации core.untrackedCache (см. git-config[1]). Однако, если изменение противоречит настроенному значению, выводится предупреждение: настроенное значение вступит в силу при следующем чтении индекса и отменит предполагаемый эффект параметра.

--test-untracked-cache

Выполнить только проверку рабочего каталога, чтобы убедиться, что можно использовать кэш неотслеживаемых файлов. Если вы действительно хотите его использовать, после этого необходимо вручную включить кэш с помощью --untracked-cache, --force-untracked-cache или переменной конфигурации core.untrackedCache. Если проверка завершится неудачно, код завершения будет равен 1 и сообщение объяснит, что работает не так, как нужно; в противном случае код завершения будет равен 0 и будет выведено сообщение OK.

--force-untracked-cache

То же, что и --untracked-cache. Предоставлен для обратной совместимости со старыми версиями Git, в которых --untracked-cache подразумевал --test-untracked-cache, тогда как этот параметр безусловно включал расширение.

--fsmonitor
--no-fsmonitor

Включить или отключить функцию монитора файловой системы. Эти параметры действуют независимо от значения переменной конфигурации core.fsmonitor (см. git-config[1]). Однако, если изменение противоречит настроенному значению, выводится предупреждение: настроенное значение вступит в силу при следующем чтении индекса и отменит предполагаемый эффект параметра.

--

Не интерпретировать последующие аргументы как параметры.

<file>

Файлы, с которыми нужно работать. Обратите внимание: файлы, начинающиеся с ., отбрасываются. Это касается ./file и dir/./file. Если это нежелательно, используйте более подходящие имена. То же относится к каталогам, заканчивающимся на /, и путям с //

Использование --refresh

--refresh не вычисляет новый файл sha1 и не приводит индекс в соответствие с изменениями режима или содержимого. Однако эта команда выполняет повторное сопоставление информации stat() файла с индексом, чтобы обновить индекс для файла, который не изменился, но чья запись stat устарела.

Например, это можно сделать после выполнения git read-tree, чтобы сопоставить сведения stat в индексе с правильными файлами.

Использование --cacheinfo или --info-only

--cacheinfo используется для регистрации файла, которого нет в текущем рабочем каталоге. Это полезно для слияния с минимальной копией.

Чтобы указать, что по заданному пути имеется файл с определённым режимом и sha1, выполните:

$ git update-index --add --cacheinfo <mode>,<sha1>,<path>

--info-only используется для регистрации файлов без помещения их в базу объектов. Это полезно для репозиториев, используемых только для просмотра состояния.

Параметры --cacheinfo и --info-only работают аналогично: индекс обновляется, а база объектов — нет. Параметр --cacheinfo полезен, когда объект есть в базе, но файл недоступен локально. Параметр --info-only полезен, когда файл доступен, но вы не хотите обновлять базу объектов.

Использование --index-info

--index-info — более мощный механизм, позволяющий передавать определения нескольких записей через стандартный ввод; он специально предназначен для сценариев. Он принимает данные в трёх форматах:

  1. mode SP type SP sha1 TAB path

    Этот формат предназначен для передачи вывода git ls-tree в индекс.

  2. mode SP sha1 SP stage TAB path

    Этот формат предназначен для добавления в файл индекса записей более высоких этапов и соответствует выводу git ls-files --stage.

  3. mode SP sha1 TAB path

    Этот формат больше не создаётся ни одной командой Git, но update-index --index-info по-прежнему поддерживает его и будет поддерживать в дальнейшем.

Чтобы добавить в индекс запись более высокого этапа, сначала необходимо удалить путь, передав для него запись с mode=0, а затем передать необходимые строки ввода в третьем формате.

Например, если изначально индекс выглядит так:

$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0       frotz

команде --index-info можно передать следующие данные:

$ git update-index --index-info
0 0000000000000000000000000000000000000000        frotz
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1        frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2        frotz

В первой строке входных данных для удаления пути указывается режим 0; SHA-1 не имеет значения, если он правильно отформатирован. Затем во второй и третьей строках для этого пути указываются записи этапов 1 и 2. После этого индекс будет выглядеть так:

$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1        frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2        frotz

Использование бита «считать неизменённым»

Многие операции Git зависят от эффективной реализации lstat(2) в вашей файловой системе, чтобы можно было быстро проверять информацию st_mtime файлов рабочего дерева и определять, изменилось ли содержимое файлов по сравнению с версией, записанной в файле индекса. К сожалению, некоторые файловые системы неэффективно реализуют lstat(2). Если ваша файловая система относится к таким, можно установить для неизменённых вами путей бит «считать неизменённым», чтобы Git не выполнял эту проверку. Обратите внимание: установка этого бита для пути не означает, что Git будет проверять содержимое файла на наличие изменений; Git пропускает проверку и считает, что файл не изменился. Изменив файлы рабочего дерева, необходимо явно сообщить об этом Git, сбросив бит «считать неизменённым» до или после внесения изменений.

Чтобы установить бит «считать неизменённым», используйте параметр --assume-unchanged. Чтобы сбросить его, используйте --no-assume-unchanged. Чтобы просмотреть файлы, для которых установлен этот бит, используйте git ls-files -v (см. git-ls-files[1]).

Команда проверяет переменную конфигурации core.ignorestat. Если её значение равно true, для путей, обновлённых с помощью git update-index paths..., а также путей, обновлённых другими командами Git, изменяющими индекс и рабочее дерево (например, git apply --index, git checkout-index -u и git read-tree -u), автоматически устанавливается бит «считать неизменённым». Обратите внимание: бит «считать неизменённым» не устанавливается, если git update-index --refresh обнаруживает, что файл рабочего дерева соответствует индексу (если нужно пометить их как «считать неизменёнными», используйте git update-index --really-refresh).

Иногда пользователи путают бит «считать неизменённым» с битом skip-worktree. Объяснение различий приведено в заключительном абзаце раздела «Бит skip-worktree» ниже.

Примеры

Чтобы обновить и освежить только уже извлечённые файлы:

$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
В неэффективной файловой системе, если задано core.ignorestat
$ git update-index --really-refresh              (1)
$ git update-index --no-assume-unchanged foo.c   (2)
$ git diff --name-only                           (3)
$ edit foo.c
$ git diff --name-only                           (4)
M foo.c
$ git update-index foo.c                         (5)
$ git diff --name-only                           (6)
$ edit foo.c
$ git diff --name-only                           (7)
$ git update-index --no-assume-unchanged foo.c   (8)
$ git diff --name-only                           (9)
M foo.c
  1. принудительно выполняет lstat(2), устанавливая биты «считать неизменённым» для путей, соответствующих индексу.

  2. помечает путь для редактирования.

  3. выполняет lstat(2) и обнаруживает, что индекс соответствует пути.

  4. выполняет lstat(2) и обнаруживает, что индекс не соответствует пути.

  5. регистрация новой версии в индексе устанавливает бит «считать неизменённым».

  6. теперь файл считается неизменённым.

  7. даже после его редактирования.

  8. после этого можно сообщить об изменении.

  9. теперь команда проверяет файл с помощью lstat(2) и обнаруживает, что он изменился.

Бит skip-worktree

Назначение бита skip-worktree можно определить одним (длинным) предложением: указать Git по возможности не записывать файл в рабочий каталог и считать файл неизменённым, если он отсутствует в рабочем каталоге.

Обратите внимание: не все команды Git учитывают этот бит, а некоторые поддерживают его лишь частично.

Флаги update-index и возможности read-tree, связанные с битом skip-worktree, появились раньше команды git-sparse-checkout[1], которая предоставляет гораздо более простой способ настройки битов skip-worktree и управления ими. Если вы хотите ограничить рабочее дерево подмножеством файлов репозитория, настоятельно рекомендуем использовать git-sparse-checkout[1], а не низкоуровневые средства update-index и read-tree.

Основная цель бита skip-worktree — поддержка разреженных извлечений, то есть рабочих каталогов, содержащих только подмножество путей. Когда установлен бит skip-worktree, команды Git (например, switch, pull, merge) не записывают эти файлы. Однако в важных случаях, например при конфликтах во время слияния или перемещения базы, эти команды всё же могут записать такие файлы. Команды Git также не считают отсутствие таких файлов намеренным удалением; например, git add -u не подготовит удаление этих файлов, а git commit -a не создаст коммит, удаляющий их.

Хотя этот бит похож на бит «считать неизменённым», его назначение другое. Бит «считать неизменённым» позволяет оставить файл в рабочем дереве, но указать Git не проверять его на изменения и считать, что файл не менялся (хотя если Git может определить изменение без обращения к файлу через stat(), он вправе записать эти изменения). Бит skip-worktree указывает Git игнорировать отсутствие файла, по возможности не обновлять его командами, которые обычно обновляют значительную часть рабочего каталога (например, checkout, switch, pull и т. д.), а также не записывать его отсутствие в коммиты. Обратите внимание: при разреженных извлечениях (настроенных с помощью git sparse-checkout или путём установки для core.sparseCheckout значения true), если файл помечен в индексе как skip-worktree, но найден в рабочем дереве, Git сбросит для этого файла бит skip-worktree.

Разделённый индекс

Этот режим предназначен для репозиториев с очень большими индексами и позволяет сократить время, затрачиваемое на их многократную запись.

В этом режиме индекс разделяется на два файла: $GIT_DIR/index и $GIT_DIR/sharedindex.<SHA-1>. Изменения накапливаются в $GIT_DIR/index — разделённом индексе, тогда как общий файл индекса содержит все записи и остаётся неизменным.

Все изменения разделённого индекса переносятся обратно в общий файл индекса, когда количество записей в разделённом индексе достигает уровня, заданного переменной конфигурации splitIndex.maxPercentChange (см. git-config[1]).

При создании каждого нового общего файла индекса старые общие файлы индекса удаляются, если время их изменения старше значения, заданного переменной конфигурации splitIndex.sharedIndexExpire (см. git-config[1]).

Чтобы не удалить используемый общий файл индекса, его время изменения обновляется до текущего каждый раз при создании нового разделённого индекса на его основе или чтении такого индекса.

Кэш неотслеживаемых файлов

Этот кэш предназначен для ускорения команд, которым нужно определять неотслеживаемые файлы, например git status.

Функция сохраняет время изменения каталогов рабочего дерева и пропускает чтение каталогов и вызовы stat для файлов в каталогах, время изменения которых не изменилось. Для этого базовая операционная система и файловая система должны менять поле st_mtime каталогов при добавлении, изменении или удалении файлов в них.

Проверить поддержку этой возможности файловой системой можно с помощью параметра --test-untracked-cache. В старых версиях Git параметр --untracked-cache неявно выполнял такую проверку, но теперь это не так.

Если вы хотите включить или отключить эту функцию, проще использовать переменную конфигурации core.untrackedCache (см. git-config[1]), а не параметр --untracked-cache команды git update-index в каждом репозитории. Это особенно удобно, если нужно применить настройку ко всем используемым репозиториям: достаточно один раз задать для переменной конфигурации значение true (или false) в файле $HOME/.gitconfig, и настройка будет действовать во всех затрагиваемых вами репозиториях.

При изменении переменной конфигурации core.untrackedCache кэш неотслеживаемых файлов добавляется в индекс или удаляется из него при следующем чтении индекса командой; при использовании параметров --[no-|force-]untracked-cache кэш неотслеживаемых файлов добавляется в индекс или удаляется из него немедленно.

До версии 2.17 в кэше неотслеживаемых файлов была ошибка: замена каталога символической ссылкой на другой каталог могла привести к тому, что отслеживаемые Git файлы ошибочно отображались как неотслеживаемые. См. коммит «status: add a failing test showing a core.untrackedCache bug» в git.git. Обходной способ (который может помочь и при других пока не обнаруженных ошибках в будущем):

$ git -c core.untrackedCache=false status

Также было показано, что эта ошибка затрагивает случаи замены каталога файлом без символической ссылки при работе с внутренними структурами кэша неотслеживаемых файлов, однако сообщений о случаях, когда это приводило к неправильному выводу «git status», не поступало.

Кроме того, в существующих индексах, записанных версиями Git до 2.17, могут содержаться ссылки на уже несуществующие каталоги, из-за чего при выполнении «git status» могут появляться многочисленные предупреждения «could not open directory». Это новые предупреждения о ранее существовавших проблемах, которые раньше молча игнорировались.

Как и в случае описанной выше ошибки, решение — однократно выполнить «git status» с параметром core.untrackedCache=false, чтобы очистить оставшиеся некорректные данные.

Монитор файловой системы

Эта функция предназначена для ускорения операций Git в репозиториях с большими рабочими каталогами.

Она позволяет Git взаимодействовать с монитором файловой системы (см. git-fsmonitor--daemon[1] и раздел «fsmonitor-watchman» в githooks[5]), который сообщает об изменённых файлах. Благодаря этому Git не приходится вызывать lstat() для каждого файла, чтобы найти изменённые файлы.

При использовании вместе с кэшем неотслеживаемых файлов эта функция может дополнительно повысить производительность, устраняя необходимость сканировать весь рабочий каталог в поисках новых файлов.

Если вы хотите включить или отключить эту функцию, проще использовать переменную конфигурации core.fsmonitor (см. git-config[1]), а не параметр --fsmonitor команды git update-index в каждом репозитории. Это особенно удобно, если нужно применить настройку ко всем используемым репозиториям: достаточно один раз задать переменную конфигурации в файле $HOME/.gitconfig, и настройка будет действовать во всех затрагиваемых вами репозиториях.

При изменении переменной конфигурации core.fsmonitor монитор файловой системы добавляется в индекс или удаляется из него при следующем чтении индекса командой. При использовании параметров --[no-]fsmonitor монитор файловой системы добавляется в индекс или удаляется из него немедленно.

Конфигурация

Команда учитывает переменную конфигурации core.filemode. Если репозиторий находится в файловой системе, где надёжность определения битов выполнения низкая, для этой переменной следует установить значение false (см. git-config[1]). В этом случае команда игнорирует различия между режимами файла, записанными в индексе, и режимами файловой системы, если они различаются только битом выполнения. При работе с такой проблемной файловой системой может потребоваться использовать git update-index --chmod=.

Аналогично, если переменной конфигурации core.symlinks задано значение false (см. git-config[1]), символические ссылки извлекаются как обычные файлы, а эта команда не меняет записанный режим файла с символической ссылки на обычный файл.

Команда проверяет переменную конфигурации core.ignorestat. См. раздел Using "assume unchanged" bit выше.

Команда также проверяет переменную конфигурации core.trustctime. Она может быть полезна, если время изменения inode регулярно меняется чем-либо вне Git (обозреватели файловых систем и системы резервного копирования используют ctime для отметки обработанных файлов) (см. git-config[1]).

Расширение кэша неотслеживаемых файлов можно включить с помощью переменной конфигурации core.untrackedCache (см. git-config[1]).

Примечания

Пользователи часто пытаются использовать биты assume-unchanged и skip-worktree, чтобы сообщить Git, что нужно игнорировать изменения отслеживаемых файлов. Это не работает так, как ожидается, поскольку Git всё ещё может сравнивать файлы рабочего дерева с индексом при выполнении определённых операций. В целом Git не предоставляет возможности игнорировать изменения отслеживаемых файлов, поэтому рекомендуется использовать альтернативные решения.

Например, если файл, который нужно изменить, — это конфигурационный файл, в репозитории можно хранить образец конфигурационного файла, который затем можно скопировать под игнорируемым именем и изменить. В репозитории даже может быть скрипт, который будет использовать образец файла как шаблон, автоматически изменяя и копируя его.

См. также

git-config[1], git-add[1], git-ls-files[1]

update-index

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-update-index

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API