Я хочу прочитать из файла, в котором git хранит историю фиксации, чтобы хранить информацию о каждой фиксации в БД моего проекта и отображать все истории в моем представлении проекта.
в каком файле git хранит историю коммитов?
Ответы (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, которая теперь имеет привязки для многих языков.
Вы можете получить представление о том, как git хранит объекты здесь: Как git хранит объекты. Прочтите другие главы этой книги в разделе «Внутреннее устройство и сантехника», чтобы понять, как все это работает.
По сути, нет «файла, в котором хранится история коммитов», это сложнее. Вы должны использовать один из существующих API для выбранного вами языка (ищите «git API» и ваш язык, их много).