Git 如何从(用户)文本内容可靠地重新计算blob sha1散列(或其他标识),并转义行结束/空格地狱?

Git 如何从(用户)文本内容可靠地重新计算blob sha1散列(或其他标识),并转义行结束/空格地狱?,git,node.js,hash,newline,sha,Git,Node.js,Hash,Newline,Sha,我有一些Node.js的代码,它们从Git(本地Git或通过Github API)中提取文本文件,并在各种场景中使用commit/tree/blob数据。但是在我(或用户)使用文件后,我在行结尾和重新计算sha哈希方面遇到了问题 数据由源代码组成。它被下载/使用/链接/导入到用户项目目录,并在开发中使用。我希望使用git blob哈希来检查相对于源blob的更改 我的设置: 我在Windows上,但使用Travis CI和VM运行构建 我使用此函数将sha1哈希计算为十六进制字符串: var c

我有一些Node.js的代码,它们从Git(本地Git或通过Github API)中提取文本文件,并在各种场景中使用commit/tree/blob数据。但是在我(或用户)使用文件后,我在行结尾和重新计算sha哈希方面遇到了问题

数据由源代码组成。它被下载/使用/链接/导入到用户项目目录,并在开发中使用。我希望使用git blob哈希来检查相对于源blob的更改

我的设置:

我在Windows上,但使用Travis CI和VM运行构建

我使用此函数将sha1哈希计算为十六进制字符串:

var crypto = require('crypto');
function blobShaHex(data:NodeBuffer, encoding?:string):string {
    return crypto.createHash('sha1').update('blob ' + data.length + '\0').update(data, encoding).digest('hex');
}
到目前为止,这似乎工作得很好:直接从repo读取的原始缓冲区数据与其哈希匹配,与utf8内容相同

问题:

在用户实际使用blob内容时,行尾会打断blob sha1:

文件可能被签入VCS,然后被行结束转换损坏。此外,用户的IDE可能会将换行符标准化为用户首选项,即使用户从未保存文件。可能会发生许多其他事情

注意:我的代码不是从文件结束的Git repo中提取blob。相反,它是一个单独的东西(如依赖关系管理器),它只是移动源于blob的文件,这些文件可能会被签入,也可能不会被签入

为了让事情变得更加混乱,我无法完全控制源回购协议的行尾,因此无法保证会采用哪种风格。甚至可能是混合约定(如果技术上可能的话?)

问题:

是否有办法恢复到原始换行符或以其他方式验证匹配?我可以再次提取原始文件并使用它进行处理

欢迎提供任何关于处理此问题的建议

--


现在我把这些都打出来了,我开始觉得尝试这样做可能是一个非常不实际的想法。也许最好强制标准化并创建和跟踪我自己的校验和,或者使用一些巧妙的空白忽略差异的东西

我将使用一个自定义哈希器,它将换行符等正常化,而不是使用Git的blobs-sha哈希

比如@gary fixler对我的问题发表了评论:

“在那里,内容完全是‘在野外’,与任何blob sha-1都没有联系。”


我认为您总是要解决这个问题,因为散列只在git提供的系统内部才有意义。正如你所说,在你和git之间有一个潜在的转换层,事实上,其中有几个(git设置、IDE设置等)。我不确定您的用例,但我认为它是高度不稳定的,因为您谈论的是用户将代码检查到(不同的?)VCS中,并在IDE中使用它。在那里,内容完全是“在野外”,与任何blob sha-1没有任何联系。谢谢,这是我逐渐意识到的。我将使用一个自定义哈希器,它将正常化,而不是使用git的blob。