Git хранит данные как "объекты" ("объект фиксации", "объект дерева", "объект BLOB-объекта" или "объект тега", сохраненный какфайл, однозначно идентифицируемый там именем, которое является хешем SHA1).Это своего рода «хэш-таблица файловой системы».В последних версиях эти объекты могут быть упакованы так, чтобы в каталоге .git/objects
было меньше маленьких файлов.Я не пойду дальше, мое понимание остановится здесь, так как я никогда не нашел смысла, чтобы узнать, как укладываются биты.Вы можете получить красивую печать в содержимом объекта с помощью:
git show -s --format=raw <commitid> # changeset content
git ls-tree <treeid> # list tree content
git show <fileid> # blob content
Mercurial сохраняет историю каждого файла отдельно как "filelog" в "revlog (NG) "формат .Вы можете вручную проверить имена файлов в .hg/store/data
(revlogNG).Обратите внимание, что специальные и прописные символы имеют кодировку «тильда-подчеркивание».
Вы можете перечислить версии файла с помощью:
hg debugindex .hg/store/data/<file>.i # hg debugindex <file> also works but you see less of internals
Вы уже отметили, что nodeid
s не являютсяодин в hg log
.
А теперь, проверьте содержимое с помощью:
hg debugdata .hg/store/data/<file>.i <nodeid>
История изменений (более или менее то, что вы видите с hg log
) хранится в .hg/store/00changelog.i
(проверьте его с помощью hg debugindex .hg/store/00changelog.i
, вы увидите те же идентификаторы, что и в hg log
в столбце nodeid
).Чтобы показать одну необработанную запись истории с идентификатором XXXX
, введите hg debugdata .hg/store/00changelog.i XXXX
в терминале.(посмотрите на первую строку, позже она будет использоваться как YYYY
)
Состояние дерева хранится в .hg/store/00manifest.i
.Соответствующий nodeid
в манифесте - YYYY
.
hg debugdata .hg/store/00manifest.i YYYY
. Это покажет список «filename + nodeid», добавленный.Давайте выберем файл foo/bar
и отметим nodeid
, добавленный к нему, и рассмотрим его ZZZZ
(строка foo/barZZZZ
).
Последний шаг, доступ к содержимому файла foo/bar
:
hg debugdata .hg/store/data/foo/bar.i ZZZZ