向每个文件添加一个不变的唯一ID

时间:2018-10-01 19:38:37

标签: git

我想为提交给git的每个文件添加唯一的ID。无论对文件进行任何其他更改,此ID均不应更改。

这里有一个类似的问题:Unique identifier for file in Git Repository,建议默认情况下git不会在提交的文件中添加unqiue ID。但是,这并不能完全说明您如何实现这一目标。

任何人都可以建议是否可以为每个已提交的文件添加唯一的不可变ID吗?

1 个答案:

答案 0 :(得分:1)

给出存储库中的路径名以及可选的提交说明符,您可以检查文件的内容的 Git的唯一ID:

$ 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一样将校验和存储在文件外部

如果您还有其他唯一标识符来源,则可以生成它们,而不必将它们链接到文件内容。该如何做取决于您。