Либо
- один или несколько файлов изменяются во время вашей операции, или
- что-то вызывает непоследовательные чтения (например, сбой оборудования).
Краткая версия: разработчики Git не собирались использовать его для нестабильных файлов.
Из-за схемы *, которую Git использует для «незакрепленных объектов», и ограниченной семантики файловой системы, которую он принимает **, Git должен знать первый байт (два шестнадцатеричных символа) имени объекта (SHA-1) нового объекта, прежде чем он сможет начать сохранение этого объекта.
*
Каталоги objects/[0-9a-f][0-9a-f]/
. См. gitrepository-layout
.
**
В частности, он должен уметь делать «атомарные» переименования файлов. Некоторые файловые системы (обычно сетевые файловые системы; в частности, AFS , я полагаю) гарантируют атомарность переименования только тогда, когда источник и место назначения переименования находятся в одном каталоге.
В настоящее время Git делает два прохода SHA-1 для каждого нового файла. Первый проход используется для проверки того, знает ли Git о содержимом файла (существует ли его имя объекта SHA-1 в хранилище объектов). Если объект уже существует, второй проход не выполняется.
Для нового содержимого (объект еще не был в хранилище объектов), файл читается второй раз при сжатии и вычислении SHA-1 сжимаемых данных. Сжатые данные записываются во временный файл, который переименовывается только в окончательное имя свободного объекта, если начальный SHA-1 (проверка «уже сохранен?») Соответствует более позднему SHA-1 (хэш данных, которые были сжаты и записаны) , Если эти хэши SHA-1 не совпадают, то Git показывает сообщение об ошибке, которое вы видите, и прерывает работу. Эта проверка ошибок была добавлена в 748af44c63 , который был впервые выпущен в Git 1.7.0.2.