Spec-Zone.ru › Git

git-fsck

Название

git-fsck — проверяет связность и корректность объектов в базе данных

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

git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
         [--[no-]full] [--strict] [--verbose] [--lost-found]
         [--[no-]dangling] [--[no-]progress] [--connectivity-only]
         [--[no-]name-objects] [--[no-]references] [<object>…​]

Описание

Проверяет связность и корректность объектов в базе данных.

Параметры

<object>

Объект, который следует считать головой трассировки недостижимости.

Если объекты не указаны, git fsck по умолчанию использует в качестве голов файл индекса, все ссылки SHA-1 в пространстве имён refs и все reflog (если не указан --no-reflogs).

--unreachable

Вывести существующие объекты, недостижимые из любого из узлов ссылок.

--dangling
--no-dangling

Вывести существующие объекты, которые никогда не используются directly (по умолчанию). Параметр --no-dangling позволяет исключить эту информацию из вывода.

--root

Сообщать о корневых узлах.

--tags

Сообщать о тегах.

--cache

Считать любой объект, записанный в индексе, также головным узлом трассировки недостижимости.

--no-reflogs

Не считать достижимыми коммиты, на которые ссылается только запись в reflog. Этот параметр предназначен только для поиска коммитов, которые раньше находились в ссылке, а теперь отсутствуют в ней, но всё ещё присутствуют в соответствующем reflog.

--full

Проверять не только объекты в GIT_OBJECT_DIRECTORY ($GIT_DIR/objects), но и объекты из дополнительных пулов объектов, перечисленных в GIT_ALTERNATE_OBJECT_DIRECTORIES или $GIT_DIR/objects/info/alternates, а также упакованные архивы Git в $GIT_DIR/objects/pack и соответствующих подкаталогах пакетов в дополнительных пулах объектов. Теперь этот параметр включён по умолчанию; его можно отключить с помощью --no-full.

--connectivity-only

Проверять только связность достижимых объектов, убеждаясь, что все объекты, на которые ссылаются достижимые теги, коммиты или деревья, существуют. Это ускоряет выполнение за счёт полного отказа от чтения blob-объектов (хотя их наличие всё равно проверяется). При этом обнаруживаются повреждения коммитов и деревьев, но не выполняются семантические проверки (например, на ошибки формата). Повреждения blob-объектов не обнаруживаются.

Также проверяются недостижимые теги, коммиты и деревья, чтобы найти вершины висячих сегментов истории. Используйте --no-dangling, если этот вывод не нужен и требуется ещё больше ускорить выполнение.

--strict

Включить более строгую проверку, в частности обнаружение режима файла с установленным битом g+w, созданного старыми версиями Git. В существующих репозиториях, включая ядро Linux, сам Git и разреженный репозиторий, есть старые объекты, вызывающие срабатывание этой проверки, однако рекомендуется проверять новые проекты с этим флагом.

--verbose

Выводить подробную информацию.

--lost-found

Записывать висячие объекты в .git/lost-found/commit/ или .git/lost-found/other/ в зависимости от типа. Если объект является blob-объектом, в файл записывается его содержимое, а не имя объекта.

--name-objects

При отображении имён достижимых объектов выводить помимо SHA-1 также имя, описывающее, как они достижимы и совместимое с git-rev-parse[1], например HEAD@{1234567890}~25^2:src/.

--progress
--no-progress

По умолчанию сведения о ходе выполнения выводятся в стандартный поток ошибок, если он подключён к терминалу, кроме случаев, когда указан --no-progress или --verbose. Параметр --progress принудительно включает вывод сведений о ходе выполнения, даже если стандартный поток ошибок не направлен в терминал.

--references
--no-references

Управлять проверкой согласованности базы данных ссылок с помощью git refs verify. Подробности см. в git-refs[1]. По умолчанию база данных ссылок проверяется.

Настройка

Всё содержимое этого раздела ниже данной строки выборочно включено из документации git-config[1]. Оно совпадает с текстом из неё:

fsck.<msg-id>

Во время выполнения fsck git может обнаружить проблемы в устаревших данных, которые не создавались бы текущими версиями git и не передавались бы по сети, если бы был установлен параметр transfer.fsckObjects. Эта возможность предназначена для работы с устаревшими репозиториями, содержащими такие данные.

Настройка fsck.<msg-id> будет использована командой git-fsck[1], но для принятия отправки таких данных нужно установить вместо неё receive.fsck.<msg-id>, а для их клонирования или извлечения — fetch.fsck.<msg-id>.

Для краткости в остальной части документации обсуждается fsck.*, однако то же относится к соответствующим переменным receive.fsck.* и fetch.fsck.*.

В отличие от таких переменных, как color.ui и core.editor, переменные receive.fsck.<msg-id> и fetch.fsck.<msg-id> не используют настройки fsck.<msg-id> в качестве значения по умолчанию, если сами не заданы. Чтобы единообразно настроить параметры fsck для разных ситуаций, всем трём переменным необходимо задать одинаковые значения.

Если задана переменная fsck.<msg-id>, ошибки можно преобразовать в предупреждения и наоборот, настроив параметр fsck.<msg-id>, где <msg-id> — идентификатор сообщения fsck, а значением является одно из error, warn или ignore. Для удобства fsck добавляет идентификатор сообщения перед ошибкой или предупреждением. Например, «missingEmail: invalid author/committer line - missing email» означает, что настройка fsck.missingEmail = ignore скроет эту проблему.

В общем случае лучше перечислить существующие проблемные объекты с помощью fsck.skipList, а не указывать типы нарушений, которые объединяют эти объекты и должны игнорироваться: при втором подходе новые случаи тех же нарушений останутся незамеченными.

Если задать неизвестное значение fsck.<msg-id>, fsck завершится с ошибкой, а при аналогичной настройке receive.fsck.<msg-id> или fetch.fsck.<msg-id> git лишь выдаст предупреждение.

Поддерживаемые значения <msg-id> см. в разделе Fsck Messages документации git-fsck[1].

fsck.skipList

Путь к списку имён объектов (то есть по одному полному SHA-1 в строке), которые заведомо повреждены, но не фатально, и должны игнорироваться. В Git версии 2.20 и новее игнорируются комментарии (#), пустые строки и любые начальные и конечные пробелы. В более старых версиях любая строка, не содержащая только SHA-1, приводит к ошибке.

Эта возможность полезна, когда нужно принять существующий проект, несмотря на ошибки в ранних коммитах, которые можно безопасно игнорировать, например неверные адреса электронной почты коммиттеров. Примечание: этой настройкой нельзя пропустить повреждённые объекты.

Как и переменная fsck.<msg-id>, эта переменная имеет соответствующие варианты receive.fsck.skipList и fetch.fsck.skipList.

В отличие от таких переменных, как color.ui и core.editor, переменные receive.fsck.skipList и fetch.fsck.skipList не используют настройку fsck.skipList в качестве значения по умолчанию, если сами не заданы. Чтобы единообразно настроить параметры fsck для разных ситуаций, всем трём переменным необходимо задать одинаковые значения.

В старых версиях Git (до 2.20) в документации указывалось, что список имён объектов должен быть отсортирован. Это никогда не было обязательным требованием: имена объектов могли располагаться в любом порядке, однако при чтении списка проверялось, отсортирован ли он, чтобы использовать внутреннюю реализацию двоичного поиска, которая могла сэкономить время при работе с уже отсортированным списком. Если только список не был огромным, специально сортировать его не имело смысла. Начиная с Git версии 2.20 используется хеш-таблица, поэтому теперь предварительная сортировка списка не нужна.

Обсуждение

git-fsck проверяет SHA-1 и общую корректность объектов, а также полностью отслеживает достижимость и всё остальное. Команда выводит все обнаруженные повреждения (отсутствующие или некорректные объекты), а при использовании флага --unreachable также выводит существующие объекты, недостижимые из любого из указанных головных узлов (или из набора по умолчанию, упомянутого выше).

Все повреждённые объекты придётся искать в резервных копиях или других архивах (то есть их можно просто удалить и выполнить rsync с каким-нибудь другим сайтом в надежде, что у кого-нибудь найдётся объект, который у вас повреждён).

Если параметр core.commitGraph имеет значение true, файл commit-graph также будет проверен с помощью git commit-graph verify. См. git-commit-graph[1].

Извлечённые диагностические сообщения

unreachable <type> <object>

Объект типа <type> <object> фактически не упоминается прямо или косвенно ни в одном из обнаруженных деревьев или коммитов. Возможно, существует другой корневой узел, который вы не указали, либо дерево повреждено. Если вы не забыли указать корневой узел, висячие узлы можно удалить, поскольку использовать их невозможно.

missing <type> <object>

На объект типа <type> <object> имеется ссылка, но в базе данных он отсутствует.

dangling <type> <object>

Объект типа <type> <object> присутствует в базе данных, но никогда не используется directly. Висячий коммит может быть корневым узлом.

hash mismatch <object>

В базе данных есть объект, хеш которого не совпадает со значением в базе данных объектов. Это указывает на серьёзную проблему с целостностью данных.

Сообщения fsck

Ниже перечислены типы ошибок, которые обнаруживает git fsck, их значение и уровень серьезности по умолчанию. Уровень серьезности ошибки, кроме ошибок, отмеченных как «(FATAL)», можно изменить, задав соответствующую переменную конфигурации fsck.<msg-id>.

badDate

(ERROR) Недопустимый формат даты в строке автора/коммитера.

badDateOverflow

(ERROR) Недопустимое значение даты в строке автора/коммитера.

badEmail

(ERROR) Недопустимый формат адреса электронной почты в строке автора/коммитера.

badFilemode

(INFO) Дерево содержит запись с некорректным режимом доступа к файлу.

badGpgsig

(ERROR) Тег содержит некорректный (усеченный) заголовок подписи (например, gpgsig).

badHeadTarget

(ERROR) Ссылка HEAD является символьной ссылкой, указывающей не на ветку.

badHeaderContinuation

(ERROR) Заголовок-продолжение (например, для gpgsig) неожиданно усечен.

badName

(ERROR) Имя автора/коммитера пусто.

badObjectSha1

(ERROR) У объекта некорректный sha1.

badPackedRefEntry

(ERROR) Файл "packed-refs" содержит недопустимую запись.

badPackedRefHeader

(ERROR) Файл "packed-refs" содержит недопустимый заголовок.

badParentSha1

(ERROR) У объекта коммита некорректный sha1 родительского коммита.

badRefContent

(ERROR) Ссылка содержит некорректные данные.

badRefFiletype

(ERROR) У ссылки некорректный тип файла.

badRefName

(ERROR) Недопустимый формат ссылки.

badRefOid

(ERROR) Ссылка указывает на недопустимый идентификатор объекта.

badReferentName

(ERROR) Недопустимое имя целевой ссылки для символьной ссылки.

badReftableTableName

(WARN) У таблицы reftable недопустимое имя.

badTagName

(INFO) У тега недопустимый формат.

badTimezone

(ERROR) В строке автора/коммитера обнаружен недопустимый часовой пояс.

badTree

(ERROR) Не удалось разобрать дерево.

badTreeSha1

(ERROR) У дерева недопустимый формат.

badType

(ERROR) Обнаружен недопустимый тип объекта.

duplicateEntries

(ERROR) Дерево содержит повторяющиеся записи файлов.

emptyName

(WARN) Путь содержит пустое имя.

emptyPackedRefsFile

(INFO) Файл "packed-refs" пуст. Если вы столкнулись с этой ошибкой, сообщите об этом в список рассылки git@vger.kernel.org. Поскольку такой пустой файл "packed_refs" создавали только очень ранние версии Git, в будущем мы можем ужесточить это правило.

extraHeaderEntry

(IGNORE) После tagger обнаружены дополнительные заголовки.

fullPathname

(WARN) Путь содержит полный путь, начинающийся с "/".

gitattributesBlob

(ERROR) По адресу .gitattributes обнаружен объект, не являющийся blob.

gitattributesLarge

(ERROR) Blob .gitattributes слишком велик.

gitattributesLineLength

(ERROR) Blob .gitattributes содержит слишком длинные строки.

gitattributesMissing

(ERROR) Не удалось прочитать blob .gitattributes.

gitattributesSymlink

(INFO) .gitattributes является символьной ссылкой.

gitignoreSymlink

(INFO) .gitignore является символьной ссылкой.

gitmodulesBlob

(ERROR) По адресу .gitmodules обнаружен объект, не являющийся blob.

gitmodulesLarge

(ERROR) Файл .gitmodules слишком велик для разбора.

gitmodulesMissing

(ERROR) Не удалось прочитать blob .gitmodules.

gitmodulesName

(ERROR) Недопустимое имя подмодуля.

gitmodulesParse

(INFO) Не удалось разобрать blob .gitmodules.

gitmodulesPath

(ERROR) Недопустимый путь .gitmodules.

gitmodulesSymlink

(ERROR) .gitmodules является символьной ссылкой.

gitmodulesUpdate

(ERROR) Обнаружена недопустимая настройка обновления подмодуля.

gitmodulesUrl

(ERROR) Обнаружен недопустимый URL подмодуля.

hasDot

(WARN) Дерево содержит запись с именем ..

hasDotdot

(WARN) Дерево содержит запись с именем ...

hasDotgit

(WARN) Дерево содержит запись с именем .git.

largePathname

(WARN) Дерево содержит запись с очень длинным именем пути. Если значение fsck.largePathname содержит двоеточие, оно используется как максимально допустимая длина (например, "warn:10" будет вызывать предупреждение для любого компонента пути длиной 11 байт или более). Значение по умолчанию — 4096.

mailmapSymlink

(INFO) .mailmap является символьной ссылкой.

missingAuthor

(ERROR) Отсутствует автор.

missingCommitter

(ERROR) Отсутствует коммитер.

missingEmail

(ERROR) В строке автора/коммитера отсутствует адрес электронной почты.

missingNameBeforeEmail

(ERROR) Перед адресом электронной почты в строке автора/коммитера отсутствует имя.

missingObject

(ERROR) В объекте тега отсутствует строка object.

missingSpaceBeforeDate

(ERROR) Перед датой в строке автора/коммитера отсутствует пробел.

missingSpaceBeforeEmail

(ERROR) Перед адресом электронной почты в строке автора/коммитера отсутствует пробел.

missingTag

(ERROR) Неожиданный конец после строки type в объекте тега.

missingTagEntry

(ERROR) В объекте тега отсутствует строка tag.

missingTaggerEntry

(INFO) В объекте тега отсутствует строка tagger.

missingTree

(ERROR) В объекте коммита отсутствует строка tree.

missingType

(ERROR) Недопустимое значение типа в строке type объекта тега.

missingTypeEntry

(ERROR) В объекте тега отсутствует строка type.

multipleAuthors

(ERROR) В коммите обнаружено несколько строк автора.

nulInCommit

(WARN) В теле объекта коммита обнаружен байт NUL.

nulInHeader

(FATAL) В заголовке объекта присутствует байт NUL.

nullSha1

(WARN) Дерево содержит записи, указывающие на нулевой sha1.

packedRefEntryNotTerminated

(ERROR) Запись в файле "packed-refs" не завершается символом новой строки.

packedRefUnsorted

(ERROR) Записи в файле "packed-refs" не отсортированы.

refMissingNewline

(INFO) Свободная ссылка не заканчивается символом новой строки (LF). Поскольку корректные реализации Git никогда не создавали такие файлы свободных ссылок, в будущем это может стать ошибкой. Если вы столкнулись с этой ошибкой, сообщите об этом в список рассылки git@vger.kernel.org, поскольку нам нужно знать, какие инструменты создали такой файл.

symlinkRef

(INFO) В качестве символьной ссылки используется символьная ссылка файловой системы. Если вы столкнулись с этой ошибкой, сообщите об этом в список рассылки git@vger.kernel.org, поскольку мы оцениваем возможность отказаться от поддержки создания символьных ссылок файловой системы в качестве символьных ссылок Git.

symrefTargetIsNotARef

(INFO) Цель символьной ссылки указывает не на корневую ссылку и не на ссылку, начинающуюся с "refs/". Хотя с помощью git symbolic-ref можно создать символьную ссылку, указывающую на цель за пределами "ref", в будущем мы можем ужесточить это правило. Если вы столкнулись с этой ошибкой, сообщите об этом в список рассылки git@vger.kernel.org, поскольку нам нужно знать, какие инструменты создали такой файл.

trailingRefContent

(INFO) Свободная ссылка содержит завершающие данные. Поскольку корректные реализации Git никогда не создавали такие файлы свободных ссылок, в будущем это может стать ошибкой. Если вы столкнулись с этой ошибкой, сообщите об этом в список рассылки git@vger.kernel.org, поскольку нам нужно знать, какие инструменты создали такой файл.

treeNotSorted

(ERROR) Дерево отсортировано неправильно.

unknownType

(ERROR) Обнаружен неизвестный тип объекта.

unterminatedHeader

(FATAL) В заголовке объекта отсутствует символ конца строки.

zeroPaddedDate

(ERROR) В строке автора/коммитера обнаружена дата с ведущими нулями.

zeroPaddedFilemode

(WARN) В дереве обнаружен режим доступа к файлу с ведущими нулями.

Переменные окружения

GIT_OBJECT_DIRECTORY

используется для указания корня базы данных объектов (обычно $GIT_DIR/objects)

GIT_INDEX_FILE

используется для указания файла индекса

GIT_ALTERNATE_OBJECT_DIRECTORIES

используется для указания дополнительных корней базы данных объектов (обычно не задана)

fsck

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

Spec-Zone.ru

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