ртутный идентификатор файла - PullRequest
3 голосов
/ 02 февраля 2012

Есть ли способ получить неизменный идентификатор файла для файла в хранилище?

Мне нужен идентификатор, который переживет переименование файла. Поэтому, если был файл Test01.txt и он был переименован в Test02.txt (с помощью пункта меню TortoiseHG rename или команды hg rename) Я хочу иметь некоторый идентификатор, который будет соответствовать Test01.txt в редакции 1 и Test02.txt в редакции 2.

1 Ответ

4 голосов
/ 02 февраля 2012

Mercurial не дает никаких идентификаторов файлам.Это отличается от некоторых других систем, таких как Bazaar, где каждый файл (и каталог) имеет уникальный идентификатор, который следует за файлом в течение всего его срока службы.

Структура в хранилище Mercurial следующая:

  • каждая запись в changelog имеет один указатель на
    • запись в манифесте , который имеет указатель на файл на
      • запись в файле filelog

Так что если вы добавите 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, чтобы увидеть, из какого файла был переименован файл на каждом шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...