git-update-ref
Имя
git-update-ref — безопасное обновление имени объекта, хранящегося в ссылке
Синопсис
git update-ref [-m <reason>] [--no-deref] -d <ref> [<old-oid>] git update-ref [-m <reason>] [--no-deref] [--create-reflog] <ref> <new-oid> [<old-oid>] git update-ref [-m <reason>] [--no-deref] --stdin [-z] [--batch-updates]
Описание
При передаче двух аргументов команда сохраняет <new-oid> в <ref>, при необходимости переходя по символическим ссылкам. Например, git update-ref HEAD <new-oid> обновляет указатель на вершину текущей ветки, указывая на новый объект.
При передаче трёх аргументов команда сохраняет <new-oid> в <ref>, при необходимости переходя по символическим ссылкам, после проверки того, что текущее значение <ref> совпадает с <old-oid>. Например, git update-ref refs/heads/master <new-oid> <old-oid> обновляет указатель на вершину ветки master, указывая на <new-oid>, только если его текущее значение равно <old-oid>. Чтобы убедиться, что создаваемая ссылка не существует, в качестве <old-oid> можно указать 40 нулей («0») или пустую строку.
Последние аргументы — это имена объектов; эта команда без параметров не поддерживает обновление символической ссылки так, чтобы она указывала на другую ссылку (см. git-symbolic-ref[1]). Однако git update-ref --stdin поддерживает команды symref-*, позволяющие зафиксировать обычные и символические ссылки в одной транзакции.
Если указан параметр --no-deref, перезаписывается сама <ref>, а не результат перехода по символическим указателям.
С параметром -d команда удаляет указанную <ref> после проверки того, что она по-прежнему содержит <old-oid>.
С параметром --stdin команда update-ref считывает инструкции из стандартного ввода и выполняет все изменения вместе. Указывайте команды в следующем формате:
update SP <ref> SP <new-oid> [SP <old-oid>] LF create SP <ref> SP <new-oid> LF delete SP <ref> [SP <old-oid>] LF verify SP <ref> [SP <old-oid>] LF symref-update SP <ref> SP <new-target> [SP (ref SP <old-target> | oid SP <old-oid>)] LF symref-create SP <ref> SP <new-target> LF symref-delete SP <ref> [SP <old-target>] LF symref-verify SP <ref> [SP <old-target>] LF option SP <opt> LF start LF prepare LF commit LF abort LF
С параметром --create-reflog команда update-ref создаёт журнал ссылок для каждой ссылки, даже если обычно он не создавался бы.
С параметром --batch-updates команда update-ref выполняет обновления пакетом, но допускает сбой отдельных обновлений из-за недопустимых или некорректных пользовательских данных, применяя только успешные обновления. Однако системные ошибки, такие как сбои ввода-вывода или нехватка памяти, приведут к полному сбою всех обновлений пакета. Сведения о неудачных обновлениях будут выведены в следующем формате:
rejected SP (<old-oid> | <old-target>) SP (<new-oid> | <new-target>) SP <rejection-reason> LF
Поля, содержащие пробелы, заключайте в кавычки так же, как строки в исходном коде на C: в двойные кавычки, с экранированием обратной косой чертой. Для указания нулевого значения используйте 40 символов «0» или пустую строку. Чтобы указать отсутствующее значение, опустите его вместе с предшествующим пробелом.
Также можно использовать -z, чтобы указать данные в формате с завершающим нулевым байтом, без кавычек:
update SP <ref> NUL <new-oid> NUL [<old-oid>] NUL create SP <ref> NUL <new-oid> NUL delete SP <ref> NUL [<old-oid>] NUL verify SP <ref> NUL [<old-oid>] NUL symref-update SP <ref> NUL <new-target> [NUL (ref NUL <old-target> | oid NUL <old-oid>)] NUL symref-create SP <ref> NUL <new-target> NUL symref-delete SP <ref> [NUL <old-target>] NUL symref-verify SP <ref> [NUL <old-target>] NUL option SP <opt> NUL start NUL prepare NUL commit NUL abort NUL
В этом формате для указания нулевого значения используйте 40 символов «0», а для указания отсутствующего значения — пустую строку.
В обоих форматах значения можно указывать в любой форме, распознаваемой Git как имя объекта. Команды в любом другом формате или повторное указание <ref> приводят к ошибке. Значения команд:
- update
-
Установить для <ref> значение <new-oid> после проверки <old-oid>, если он указан. Укажите нулевой <new-oid>, чтобы после обновления ссылка не существовала, и/или нулевой <old-oid>, чтобы убедиться, что до обновления ссылка не существует.
- create
-
Создать <ref> со значением <new-oid> после проверки того, что она не существует. Указанное значение <new-oid> не может быть нулевым.
- delete
-
Удалить <ref> после проверки того, что она существует и содержит <old-oid>, если он указан. Если <old-oid> указан, он не может быть нулевым.
- symref-update
-
Установить для <ref> значение <new-target> после проверки <old-target> или <old-oid>, если они указаны. Укажите нулевой <old-oid>, чтобы убедиться, что до обновления ссылка не существует.
- verify
-
Проверить <ref> на соответствие <old-oid>, не изменяя её. Если <old-oid> равен нулю или не указан, ссылка не должна существовать.
- symref-create
-
Создать символическую ссылку <ref> со значением <new-target> после проверки того, что она не существует.
- symref-delete
-
Удалить <ref> после проверки того, что она существует и содержит <old-target>, если он указан.
- symref-verify
-
Проверить символическую <ref> на соответствие <old-target>, не изменяя её. Если <old-target> не указан, ссылка не должна существовать. Эту команду можно использовать только в режиме
no-deref. - option
-
Изменить поведение следующей команды, в которой указана <ref>. Единственный допустимый параметр —
no-deref, запрещающий переход по символической ссылке. - start
-
Начать транзакцию. В отличие от сеанса без транзакции, транзакция автоматически прерывается, если сеанс завершается без явной фиксации. Эта команда может создать новую пустую транзакцию, если текущая уже была зафиксирована или прервана.
- prepare
-
Подготовить транзакцию к фиксации. Для всех поставленных в очередь обновлений ссылок будут созданы файлы блокировки. Если заблокировать одну из ссылок не удастся, транзакция будет прервана.
- commit
-
Зафиксировать все обновления ссылок, поставленные в очередь для транзакции, и завершить транзакцию.
- abort
-
Прервать транзакцию, сняв все блокировки, если транзакция находится в подготовленном состоянии.
Если все <ref> удаётся одновременно заблокировать при совпадении значений <old-oid>, выполняются все изменения. В противном случае изменения не выполняются. Обратите внимание: хотя каждая отдельная <ref> обновляется или удаляется атомарно, параллельный читатель всё ещё может увидеть лишь часть изменений.
Журналирование обновлений
Если параметр конфигурации "core.logAllRefUpdates" имеет значение true и ссылка находится в "refs/heads/", "refs/remotes/", "refs/notes/" либо является псевдоссылкой, например HEAD или ORIG_HEAD, или если файл "$GIT_DIR/logs/<ref>" существует, то git update-ref добавит строку в файл журнала "$GIT_DIR/logs/<ref>" (перед созданием имени журнала переходя по всем символическим ссылкам), описывающую изменение значения ссылки. Строки журнала имеют следующий формат:
oldsha1 SP newsha1 SP committer LF
Здесь "oldsha1" — ранее сохранённое в <ref> 40-значное шестнадцатеричное значение, "newsha1" — 40-значное шестнадцатеричное значение <new-oid>, а "committer" — имя, адрес электронной почты и дата коммитера в стандартном формате идентификатора коммитера Git.
При указании -m формат будет следующим:
oldsha1 SP newsha1 SP committer TAB message LF
Все поля имеют описанные выше значения, а "message" — это значение, переданное параметру -m.
Обновление завершится ошибкой (не изменив <ref>), если текущий пользователь не может создать новый файл журнала, добавить данные в существующий файл журнала или если данные коммитера недоступны.
Примечания
Изначально символические ссылки реализовывались с помощью символических ссылок файловой системы. Сейчас этот способ считается устаревшим, поскольку не все файловые системы поддерживают символические ссылки.
Эта команда переходит по реальным символическим ссылкам, только если они начинаются с "refs/"; в противном случае она просто попытается прочитать их и обновить как обычный файл (то есть позволит файловой системе перейти по ним, но заменит такую символическую ссылку, указывающую в другое место, обычным файлом).
См. также
update-ref
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-update-ref