Дополнительные права файлов в git
Допустим, я создаю файл с правами 644, затем делаю коммит с этим файлом
Вывод git 2.27.0:
create mode 100644
Что означают первые две цифры(10)?
Ответы (2 шт):
Режим (mode) файла в unix содержит не только права доступа в виде привычных 3-х цифр, но и дополнительные флаги: является ли файл обычным, символической ссылкой, сокетом, каталогом или устройством. В частности 10xxxx обозначает обычный файл, а 12xxxx - символическую ссылку.
Подробности: http://cmcmsu.info/2course/unix.file.attributes.htm
Из всего этого многообразия git использует
100xxx- обычный файл120xxx- символическая ссылка160xxx- gitlink (сам пока не знаю что это)
Подробности: https://github.com/git/git/blob/master/Documentation/technical/index-format.txt#L63-L72
Таким образом mode 100644 обозначает обычный файл с правами 644
для начала: git — это адресуемая содержимым файловая система (подробности описаны по ссылке):
git is a content-addressable filesystem
условно говоря, внутри каждого git-хранилища содержится информация про объекты эдакой «виртуальной файловой системы».
при клонировании (точнее, при выполнении команды checkout) на основании этой информации создаются объекты реальной файловой системы: файлы, каталоги, символические ссылки.
так уж исторически сложилось, что эта виртуальная файловая система довольна похожа на множество файловых систем, соответствующих стандарту posix (первоначальный разработчик программы git является и первоначальным разработчиком программы linux, в которой почти сразу была реализована поддержка собственной posix-совместимой ф.с. ext).
в частности, стандартом определена структура stat, содержащая информацию про объекты файловой системы, в том числе и поле st_mode, содержащее и тип объекта, и права доступа к нему. тип объекта задаётся константами (S_IFDIR и т.п.), конкретные значения которых стандартом не определены.
в «виртуальной файловой системе» программы git используются только следующие типы файловых объектов (в документации упомянуто даже меньше):
040000 объект типа tree (из него создаётся каталог)
100xxx объект типа blob (из него создаётся обычный файл,
xxx может быть 755 или 644 — права доступа к файлу)
120000 объект типа blob (из него создаётся символическая ссылка)
160000 объект типа commit (из него создаётся пустой каталог)
последний из типов объектов используется как точка подключения под-модуля («git submodule»). в документации носит название «gitlink».
резюмируя: это не «дополнительные права», а дополнительная информация про объект файловой системы (пусть и виртуальной в данном случае), описывающая его тип.
увидеть типы объектов можно с помощью команды:
$ git ls-tree ссылка [каталог]
где ссылка — это хэш коммита, имя ветки или метки (в т.ч. HEAD).
кстати, с помощью присутствующей в gnu/coreutils программы stat можно увидеть полное содержимое поля st_mode для объектов реальной файловой системы:
$ stat -c '%f' файл
81a4
это в шестнадцатиричной системе. а переведя в восьмиричную, увидим знакомые:
$ echo 'obase=8;ibase=16;81A4' | bc
100644