git - 如何从(用户)文本内容可靠地重新计算 blob sha1 哈希(或其他身份)并逃脱行尾/空白 hell ?

标签 git node.js hash newline sha

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

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

我的设置:

我使用的是 Windows,但使用 Travis-CI 和虚拟机来运行构建。

我使用此函数将 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');
}

到目前为止,这似乎工作得很好:直接从存储库读取为原始缓冲区的数据与其哈希值匹配,与 utf8 内容相同。

问题:

在实际用户使用 blob 内容时,行结尾会破坏 blob sha1:

该文件可能会 checkin VCS,然后因行尾转换而受到破坏。此外,即使用户从未保存文件,用户的 IDE 也可能会根据用户首选项规范换行符。许多其他事情可能会发生。

注意:我的代码没有从文件最终所在的 Git 存储库中提取 blob。相反,它是一个单独的东西(如依赖项管理器),只是移动源自 blob 的文件,这些文件可能会或可能不会在某个地方 checkin 。

为了让事情变得更加困惑,我无法完全控制源存储库的行结尾,因此无法保证随后会采用哪种样式。甚至可能是混合约定(如果技术上可行的话?)。

问题:

是否有某种方法可以恢复到原始换行符或以其他方式验证匹配?我可以再次提取原始文件并用它做一些事情。

欢迎任何有关处理此问题的建议。

--

现在我把这些都打出来了,我开始认为尝试这个可能是一个非常不切实际的想法。也许最好强制标准化并创建和跟踪我自己的校验和或使用一些聪明的空白忽略差异事物?

最佳答案

我将使用一个自定义的哈希器来标准化换行符等,而不是使用 Git 的 blob sha 哈希值。

就像 @gary-fixler 对我的问题评论一样:

"Out there the content is totally 'in the wild,' and has no connection to any blob sha-1."

关于git - 如何从(用户)文本内容可靠地重新计算 blob sha1 哈希(或其他身份)并逃脱行尾/空白 hell ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759645/

相关文章:

repo 中的 python-git check out 文件

Git:查看我的最后一次提交

javascript - Angular/Node/Mongoose - 渲染帖子、评论、回复

javascript - 如果我使用 process.send(),node.js 会等待回调/响应

ruby - 在 Ruby 哈希中查找保留重复项

git - 在 Azure 上使用 Git 子模块持续部署 VSTS 应用程序失败

git - 回到历史上一个未损坏的版本?

node.js - process.stderr.on ('data' ) 和 process.on ('error' ) 有什么区别?

arrays - 如果在数组中找不到,perl 删除散列项

arrays - 在多个级别上同时合并哈希数组的复杂哈希