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> см. в разделе
FsckMessagesдокументации 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/". Хотя с помощью
gitsymbolic-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