Добавить неизменяемый уникальный идентификатор в каждый файл - PullRequest
0 голосов
/ 01 октября 2018

Я хотел добавить уникальный идентификатор для каждого файла, который передается в git.Этот идентификатор никогда не должен изменяться независимо от любых других изменений, внесенных в файлы.

Здесь есть похожий вопрос: Уникальный идентификатор файла в репозитории Git , где рекомендуется, что по умолчанию git делаетне добавлять unqiue id к файлам, которые переданы.Однако это не полностью объясняет, как вы можете этого достичь.

Может кто-нибудь посоветовать, можно ли добавить уникальный неизменяемый идентификатор в каждый зафиксированный файл?

1 Ответ

0 голосов
/ 01 октября 2018

Учитывая имя пути в репозитории и, необязательно, спецификатор фиксации, вы можете проверить Git's уникальный идентификатор содержимого файла:

$ git hash-object -t blob Makefile
5a969f5830a4105d3e3e6236eaa51e19880cc873
$ git rev-parse :Makefile
5a969f5830a4105d3e3e6236eaa51e19880cc873
$ git rev-parse HEAD:Makefile
5a969f5830a4105d3e3e6236eaa51e19880cc873

(Эти три копии файлавсе они идентичны, в данном случае Makefile находится в рабочем дереве, :Makefile находится в индексе, а HEAD:Makefile находится в текущем коммите.)

$ git rev-parse v2.1.0:Makefile
2320de592e6dbc545866e6bfef09a05f660c2c14

(ВерсияMakefile совершено в коммите v2.1.0 не совпадает с тремя выше.)

Обратите внимание, что хотя Git по-прежнему использует SHA-1, это не то же самое, что SHA-1 фактического содержимого файла:

$ sha1sum Makefile
857f75d0f314501dfdfcc5b6a4306eba1faddd31  Makefile
$ python
[python startup messages]
>>> import hashlib
>>> hashlib.sha1(open('Makefile', 'rb').read()).hexdigest()
'857f75d0f314501dfdfcc5b6a4306eba1faddd31'

Это потому, что Git проверяет контрольную сумму данных после привязки к заголовку:

>>> data = open('Makefile', 'rb').read()
>>> hashlib.sha1('blob {}\0'.format(len(data)).encode('ascii') + data).hexdigest()
'5a969f5830a4105d3e3e6236eaa51e19880cc873'

Обратите внимание, однако, что если вы добавляете заголовок к файл, а затем контрольную сумму полученного файла, вы получите новую и другую контрольную сумму , потому что теперь вы проверяете контрольную сумму заголовка плюс данные файла.Если вы сохраните новую контрольную сумму в файле и получите контрольную сумму результата, вы получите еще третью контрольную сумму.Чтобы избежать этой проблемы постоянно меняющихся контрольных сумм, вам нужна либо более слабая контрольная сумма - та, где вы можете вычислить правильный ввод для получения желаемого результата (например, контрольная сумма стиля заголовка IP) - или для контрольной суммы данных , исключая контрольную суммусам .Или, конечно, вы можете хранить контрольную сумму вне файла , как это делает Git.

Если у вас есть другой источник уникальных идентификаторов, вы можете просто сгенерировать их, а не связать ихк содержанию файла.Как это сделать, решать только вам.

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