Mercurial не дает никаких идентификаторов файлам.Это отличается от некоторых других систем, таких как Bazaar, где каждый файл (и каталог) имеет уникальный идентификатор, который следует за файлом в течение всего его срока службы.
Структура в хранилище Mercurial следующая:
- каждая запись в changelog имеет один указатель на
- запись в манифесте , который имеет указатель на файл на
Так что если вы добавите Test01.txt
в ревизию 0, то выу вас будет такая цепочка
changelog@0 -> manifest@0 -> Test01.txt@0
Если вы сейчас переименуете и сделаете новый коммит, вы создадите новую запись в журнале изменений и манифесте и создадите новый файллог для Test02.txt
:
changelog@1 -> manifest@1 -> Test02.txt@0
Новая запись в Test02.txt
filelog будет ссылаться на запись Test01.txt
.Вот как Mercurial может отслеживать переименования:
$ hg debugdata Test02.txt 0
copy: Test01.txt
copyrev: 0936f74a58571dd87ad343cc3d6ae8434ad86fc4
test01
Лучший «идентификатор файла», о котором вы можете говорить, это, следовательно, идентификатор первой записи в исходном журнале файлов.Вы можете найти его с помощью hg debugindex
:
$ hg debugindex Test01.txt
rev offset length base linkrev nodeid p1 p2
0 0 8 0 0 0936f74a5857 000000000000 000000000000
В столбце "nodeid" указаны идентификаторы для записей журнала в файле журнала для Test01.txt
.Здесь мы видим, что первая версия файла имеет идентификатор 0936f74a5857
.Это всего лишь короткий 12-символьный префикс полного 40-символьного хеш-кода SHA-1.Если вам нужен полный хэш, тогда читайте дальше ...
"linkrev" сообщает, что на эту версию файла ссылается набор изменений 0. Вы можете искать данные в этой записи журнала изменений с помощью hg debugdata -c 0
, но для наших целей обычная команда hg log
также имеет информацию:
$ hg log -r 0 --debug
changeset: 0:8e62ecaada0e5ba9efec234d0d9a66583347becf
phase: draft
parent: -1:0000000000000000000000000000000000000000
parent: -1:0000000000000000000000000000000000000000
manifest: 0:0537c846cd545da8f826b9d94fdb2fdae457bd07
user: Martin Geisler <mg@aragost.com>
date: Thu Feb 02 09:00:18 2012 +0100
files+: Test01.txt
extra: branch=default
description:
01
Нас интересует идентификатор манифеста.Теперь вы можете искать данные в правильной записи манифеста с помощью:
$ hg debugdata -m 0537c846cd545da8f826b9d94fdb2fdae457bd07
Test01.txt0936f74a58571dd87ad343cc3d6ae8434ad86fc4
Между именем файла и идентификатором файла журнала действительно есть байт NUL
, но он не виден в вашем терминале.Теперь у вас есть полный идентификатор файла журнала для первой ревизии файла Test01.txt
.
Вам также нужно перейти от Test02.txt
к Test01.txt
.Для этого вы можете использовать hg log --follow
и hg debugrename
: используйте hg log
, чтобы получить ревизии, касающиеся файла, и используйте hg debugrename
, чтобы увидеть, из какого файла был переименован файл на каждом шаге.