Что означают различные поля в выводе `git ls-files -s`?

В Git типичная строка результата возвращается командой git ls-files -s похоже

100755 be2c2e9b0966253096472d4b482c458bc892e493 0 .gitignore

Что означают эти поля?

1 ответ

Решение

Смотрите не дальше, чем git ls-files справочная страница:

git ls-files просто выводит имена файлов, если --stage указано, в каком случае он выводит:

       [<tag> ]<mode> <object> <stage> <file>

(The --stage флаг эквивалентен -s.)

Что означают эти поля?

  • <mode> биты режима. Подробнее читайте в разделе Как читать поле режима вывода git-ls-tree
  • <object> является SHA соответствующего большого двоичного объекта, то есть уникальным идентификатором содержимого рассматриваемого файла.
  • <stage> это номер этапа, который обычно 0 но принимает ненулевые значения для файлов с конфликтами слияния.
  • <file> это просто путь к файлу.

Вы также спрашиваете, в одном из ваших последующих комментариев,

Какова связь между <object> и <file>?

Они полностью независимы, поскольку только содержимое файла (не его путь / имя файла) используется для создания хэша, связанного с ним. Чтобы убедиться в этом, вы можете провести следующий эксперимент в хранилище игрушек:

# set things up
$ mkdir testgit
$ cd testgit/
$ git init

# write the same contents to two files
$ printf "foo\n" > README.md
$ printf "foo\n" > bar.txt

# stage the two files and run git ls-files
$ git add .
$ git ls-files -s
100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0   README.md
100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0   bar.txt

Обратите внимание, что, хотя эти два файла имеют разные имена, они имеют идентичные SHA, поскольку они имеют одинаковое содержимое.

Другие вопросы по тегам