当前位置:  开发笔记 > 编程语言 > 正文

如何在没有Git的情况下将Git SHA1分配给文件?

如何解决《如何在没有Git的情况下将GitSHA1分配给文件?》经验,为你挑选了3个好方法。

据我所知,当Git为文件分配SHA1哈希时,该SHA1对于文件的内容是唯一的.

因此,如果文件从一个存储库移动到另一个存储库,则该文件的SHA1保持不变,因为其内容未更改.

Git如何计算SHA1摘要?它是在完整的未压缩文件内容上执行的吗?

我想模仿在Git之外分配SHA1.



1> Ferdinand Be..:

这就是Git如何计算文件的SHA1(或者,用Git术语计算"blob"):

sha1("blob " + filesize + "\0" + data)

因此,您无需安装Git即可轻松自行计算.请注意,"\ 0"是NULL字节,而不是两个字符的字符串.

例如,空文件的哈希:

sha1("blob 0\0") = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"

$ touch empty
$ git hash-object empty
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

另一个例子:

sha1("blob 7\0foobar\n") = "323fae03f4606ea9991df8befbb2fca795e648fa"

$ echo "foobar" > foo.txt
$ git hash-object foo.txt 
323fae03f4606ea9991df8befbb2fca795e648fa

这是一个Python实现:

from hashlib import sha1
def githash(data):
    s = sha1()
    s.update("blob %u\0" % len(data))
    s.update(data)
    return s.hexdigest()


使用python 3,你需要编码数据:`s.update(("blob%u\0"%filesize).encode('utf-8'))`以避免`TypeError`.

2> knittl..:

一点点好东西:在壳里

echo -en "blob ${#CONTENTS}\0$CONTENTS" | sha1sum


@FrustratedWithFormsDesigner:如果从shadin计算散列而不是从文件计算散列,那么`sha`s`将使用尾随的`-`.没什么好担心的.关于`-n`的奇怪之处在于它应该抑制通常由echo追加的换行符.您的文件是否有空的最后一行,您忘记在`CONTENTS`变量中添加?

3> CB Bailey..:

如果你没有安装git,你可以使用bash shell函数来很容易地计算它.

git_id () { printf 'blob %s\0' "$(ls -l "$1" | awk '{print $5;}')" | cat - "$1" | sha1sum | awk '{print $1}'; }

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有