2015-01-26 4 views

ответ

2

Нет необходимости искать дальше, чем git ls-files man page:

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

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

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

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

  • <mode> - это биты режима. Подробнее в How to read the mode field of git-ls-tree's output
  • <object> является SHA соответствующего blob, то есть уникальным идентификатором для содержимого данного файла.
  • <stage> - номер этапа, который обычно равен 0, но принимает ненулевые значения для файлов с конфликтами слияния.
  • <file> - это просто путь к файлу.

Вы также спросить, в one of your follow-up comment,

Что отношение между <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 

Обратите внимание, что, несмотря на то, что оба файл имеет разные имена, они имеют одинаковый ШАС, так как они имеют то же содержание.

+0

Какова связь между '' и' '? – qazwsx

+0

@qazwsx объект является хешем содержимого файла, который также является адресом объекта git, используемого для хранения содержимого файла (поскольку git - это, по сути, файловая система с контентом, которая имеет встроенную систему управления версиями Сверху). – hobbs

+0

Является ли содержимое адресованным '' (т. Е. Дайджест SHA-1) обычно * частью * содержимого файла ''? – qazwsx