2013-05-02 3 views
0

хотел узнать, как пройти список всех коммитов (или всех из одной ветви) в git. Как это делает git log (указатели на часть кодов тоже будут классными, я просто не знаю, с чего начать)? Могу ли я сделать это на сырой файловой системе?Как пройти репозиторий git на нижнем уровне (чем git log)

Рассуждение: необходимо написать инструмент на другом языке, который не требует вызова системной команды.

ОБНОВЛЕНИЕ: Я читал Git internals: Git objects (и следующие главы), я понимаю, что есть также packfiles. Основная проблема, которую я имею, заключается в том, чтобы понять, что происходит, когда мы запускаем: git rev-list --all. Или - для одной ветви - та же команда без --all флаг. Является ли git фигурой из головы, вытаскивает ее из хранилища объектов, проверяет шары родителей, вытаскивает их из хранилища объектов и так далее? Или есть какой-то другой, более быстрый метод?

+3

Прочитать http://git-scm.com/book/en/Git-Internals, особенно http://git-scm.com/book/en/Git-Internals-Git-Objects –

ответ

2

Не уверен, что если вы уже сталкивались с этим: LibGit2: https://github.com/libgit2/libgit2

libgit2 представляет собой портативный, чистая реализация C из основных методов Git при условии, как Реентрантная вулканизующегося библиотеки с твердым API, позволяющим вы записывать собственные приложения Git с собственной скоростью на любом языке с привязками .

Сво с открытым исходным кодом, просматривая код, должны дать вам некоторые ценный вклад .. Например: Commit.c

0

Ветви простые файлы в папке .git/refs, каждый файл содержит sha1 для тока ответвление. Кроме того, после git gc все ссылки могут быть собраны в файле .git/packed-refs.