в каком файле git хранит историю коммитов?

Я хочу прочитать из файла, в котором git хранит историю фиксации, чтобы хранить информацию о каждой фиксации в БД моего проекта и отображать все истории в моем представлении проекта.


person gasser    schedule 18.09.2011    source источник


Ответы (2)


Нет ни одного файла, который вы можете запросить, чтобы получить историю коммитов. Существует множество хороших объяснений объектной модели git (например, git для программистов, Pro Git, сообщество git book), но здесь может быть полезно краткое объяснение:

В git есть различные типы объектов, наиболее важные из них:

  • blobs (файлы) — только двоичные файлы
  • деревья (каталоги) — дерево представляет собой список других объектов (обычно блобов и деревьев) с их именем, хешем и ограниченным набором разрешений.
  • коммиты (версии) — каждая фиксация включает хэши своих родительских коммитов, автора, сообщение коммита и другие метаданные.

Каждый из них идентифицируется хешем его содержимого, и этот хэш известен как имя объекта — это 40-значные шестнадцатеричные строки, которые вы, вероятно, видели в ходе использования git. Каждый объект хранится в каталоге .git/objects/ либо как отдельный объект (по одному на файл), либо как один из многих объектов, эффективно хранящихся в пакетном файле. Файл .git/HEAD представляет текущую версию вашего репозитория и обычно содержит ссылку на конкретную ветку, представленную файлом под .git/refs/heads или ссылкой, хранящейся в пакетном файле. (HEAD может также указывать непосредственно на имя объекта конкретной фиксации.) Один из этих файлов, представляющих ветку, например .git/refs/heads/master, просто содержит имя объекта.

Чтобы пройти историю назад от этой ветки, git найдет объект, названный в этом файле, в базе данных объектов и рекурсивно будет следовать указателям на его родителей.


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

  • Вызовите команды git, чтобы найти историю. Если вы придерживаетесь так называемых «подключаемых» команд, их вывод должен быть стабильным в разных версиях git.
  • Используйте библиотеку libgit2 для опроса репозитория. libgit2 — это полностью реентерабельная библиотека для опроса репозиториев git, которая теперь имеет привязки для многих языков.
person Mark Longair    schedule 18.09.2011
comment
Вам не хватает четвертого объекта: тегов - person wilhelmtell; 20.09.2011
comment
@wilhelmtell: именно поэтому я сказал, что в git есть различные типы объектов, самое главное [...]. - person Mark Longair; 20.09.2011
comment
Эй, я ищу, когда я возвращаю коммит, что делает git, и нахожу ваш ответ. У меня есть вопрос, когда я возвращаю коммит git, расшифровываю хэш коммита, а затем нахожу мой файл? - person Murad Sofiyev; 23.08.2017

Вы можете получить представление о том, как git хранит объекты здесь: Как git хранит объекты. Прочтите другие главы этой книги в разделе «Внутреннее устройство и сантехника», чтобы понять, как все это работает.

По сути, нет «файла, в котором хранится история коммитов», это сложнее. Вы должны использовать один из существующих API для выбранного вами языка (ищите «git API» и ваш язык, их много).

person Mat    schedule 18.09.2011