成为git砖家(10): 根据文件内容生成SHA-1

news2025/1/11 18:45:47

文章目录

    • 1. `.git/objects` 目录
    • 2. `git cat-file` 命令
    • 3. 根据文件内容生成 sha-1
    • 4. 结语
    • 5. References

1. .git/objects 目录

git 是一个根据文件内容进行检索的系统。 当创建 hello.py, 填入

print("hello, world")

的内容, 并执行

git add hello.py
git commit -m "init"

会在 .git/objects 目录生成子目录和文件。 子目录是2位,文件则是38位, 子目录和文件名字拼接起来的到的40位哈希码, 就是 SHA-1:

在这里插入图片描述
比较新版本的 git, 当执行上述 git 操作后, 会在 .git/objects 里存储多个子目录, 旧版本的 git 则只生成一个子目录。我用的 git 2.45.2, 目录结构为:

在这里插入图片描述

2. git cat-file 命令

git cat-file 命令能查看 sha-1 的情况, 这里暂时未查阅文档, 仅做基本介绍。

git cat-file -t <sha-1> 查看的是 sha-1 的类型。 其中 sha-1 是子目录和文件拼接起来的。例如

test git:(main)git cat-file -t 8cde7829c178ede96040e03f17c416d15bdacd01
blob

git cat-file -p <sha-1> 则是查看 blob 类型的内容:

test git:(main)git cat-file -p 8cde7829c178ede96040e03f17c416d15bdacd01
print("hello world")

3. 根据文件内容生成 sha-1

git 其实已经帮我们计算了 sha-1, 这是它存储文件时最基本的计算。 当我们有两个内容完全一样的文件被 git addgit commit, 对应的 blob 对象是相同的。

作为验证,我们拷贝 hello.py 内容并提交:

test git:(main)cp hello.py world.py
➜  test git:(main)git add world.py
➜  test git:(main)git commit -m "add world.py"
[main f72f05d] add world.py
 1 file changed, 1 insertion(+)
 create mode 100644 world.py

在这里插入图片描述
发现 .git/objects 目录新增的两个子目录,分别是 tree 和 commit 类型,并不是 blob 类型。 换言之, world.pyhello.py 对应的 blob 都是 8cde7829c17.

作为验证, 可以使用 Python 的 hashlib模块, 基于如下格式算出 sha-1:

blob {文件内容长度}\0 {file_content}

其中 {file_content} 是文件内容.

的到的结果是:

test git:(main) ✗ python githash.py hello.py
8cde7829c178ede96040e03f17c416d15bdacd01
➜  test git:(main) ✗ python githash.py world.py
8cde7829c178ede96040e03f17c416d15bdacd01

具体的 githash.py 实现如下:

#!/usr/bin/env python3

from sys import argv
from hashlib import sha1
from io import StringIO

class Githash(object):
    def __init__(self):
        self.buf = StringIO()

    def update(self, data):
        self.buf.write(data)

    def hexdigest(self):
        data = self.buf.getvalue().encode('utf-8')
        h = sha1()
        h.update(f"blob {len(data)}\0".encode('utf-8'))
        h.update(data)

        return h.hexdigest()

def githash_data(data):
    h = Githash()
    h.update(data)
    return h.hexdigest()

def githash_fileobj(fileobj):
    return githash_data(fileobj.read())

if __name__ == '__main__':
    for filename in argv[1:]:
        with open(filename, 'r', encoding='utf-8') as fileobj:
            print(githash_fileobj(fileobj))

4. 结语

.git/objects 目录存放的子目录中, 有些子目录是 blob 类型的对象, 表示了文件内容。 当两个文件内容一致时, git 对它们生成相同的 SHA-1。 在了解 blob 类型对象的 sha-1 计算过程的前提下,基于 Python 的 hashlib 写了一个工具, 能根据文件内容算出 sha-1, 这既可以作为理解 git 对象存储的初步, 也可以作为后续自行实现一个 mini-git 的基础。

5. References

  • https://gist.github.com/msabramo/763200
  • https://www.bilibili.com/video/BV1FZ4y1W7ZS/?p=2&spm_id_from=pageDriver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——1到手测试

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——1到手测试 ​ 大家好&#xff0c;今天给大家带来的是购买到小车或者说RDK X3之后直接快速体验&#xff0c;今天主要围绕官方的快速入门手册进行逐步测试 1.知识补充1 ​ 在这里首先要给新手小白补充几…

JVM结构、架构与生命周期总结

【1】JVM结构 不同厂商的JVM产品 &#xff1a; 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天&#xff0c;Java程序的运行性能早已脱胎换骨&#xff0c;已…

数据上新 | 景联文科技推出高质量方言音文对数据集,驱动方言语音大模型技术革新

中国电信人工智能研究院&#xff08;TeleAI&#xff09;正式对外发布星辰超多方言语音识别大模型。这是业内首个支持30种方言自由混说的语音识别大模型&#xff0c;也是目前国内支持最多方言的语音识别大模型。 方言语音大模型具有广泛的应用场景&#xff0c;可以应用于语音助手…

1.1.9创建应用

1.在全局配置文件下找到urls.py进行路由配置 配置路由要指明哪个应用&#xff0c;和写好模块导入的函数 2.找到路由要启动的应用&#xff0c;在应用里找到视图函数进行设计 path&#xff08;‘url模式/“&#xff0c;视图函数&#xff09; 注意第五部没有/ 1.1.110路由匹配模…

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

小阿轩yx-KVMGFS 分布式存储系统构建 KVM 高可用 案例分析 案例概述 使用 KVM 及 GlusterFS 技术&#xff0c;结合起来实现 KVM 高可用利用 GlusterFS 分布式复制卷对 KVM 虚拟机文件进行分布存储和冗余 分布式复制卷 主要用于需要冗余的情况下把一个文件存放在两个或两个…

刚起步的海外仓怎么选WMS系统,要注意什么

对于刚起步的海外仓企业来说&#xff0c;最紧要的事情就是把核心业务打磨平稳&#xff0c;形成核心竞争力&#xff0c;才能在激烈的竞争中赢得一席之地。 而要实现这个目的&#xff0c;WMS海外仓系统的引入当然是必要的一环&#xff0c;不过因为刚起步&#xff0c;业务和资源都…

AI产品经理的职责与能力:将AI技术转化为实际价值

一、AI产品经理的职责 发现和解决问题&#xff1a;AI产品经理需要具备敏锐的洞察力&#xff0c;能够发现用户需求和痛点&#xff0c;并提出相应的解决方案。传递价值给用户&#xff1a;AI产品经理需要确保产品能够满足用户的需求&#xff0c;提供价值&#xff0c;并提升用户体…

大模型之语言大模型技术

本文作为大模型综述第二篇,介绍语言大模型基本技术。 近年来,在 Transformer 架构基础上构建的预训练语言模型为自然语言处理领域带来了一系列突破式进展,成为人工智能主流技术范式。预训练语言模型采用“预训练+微调”方法,主要分为两步: 1)将模型在大规模无标注数据上…

No static resource favicon.ico.问题解决

一&#xff0c;问题 Spring Boot项目调用接口时报错 org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico. at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpReques…

餐饮卫生数字化防线:EasyCVR明厨亮灶/透明厨房/阳光厨房视频监管方案

近期有新闻报道&#xff0c;某互联网大厂办事处发生了一起大规模食物中毒事件&#xff0c;导致近60人住院。餐饮食品卫生安全直接关系到人民群众的身体健康和生命安全&#xff0c;是社会关注的焦点。 传统的监管方式往往依赖于人力巡查和抽检&#xff0c;存在效率低、覆盖面窄…

企业邮箱安全稳定吗?

企业邮箱安全稳定吗&#xff1f;企业邮箱通过GDPR等国际标准保护数据&#xff0c;采用加密技术、反垃圾邮件、身份验证等措施确保安全。服务器全球分布&#xff0c;灾难恢复和备份确保稳定。Zoho邮箱提供多种版本和注册流程&#xff0c;支持邮件协作、备份与恢复等功能。 一、…

成为一名月薪 2 万的 web 安全工程师需要掌握哪些技能?

现在 web 安全工程师比较火&#xff0c;岗位比较稀缺&#xff0c;现在除了一些大公司对学历要求严格&#xff0c;其余公司看中的大部分是能力。 有个亲戚的儿子已经工作 2 年了……当初也是因为其他的行业要求比较高&#xff0c;所以才选择的 web 安全方向。 资料免费分享给你…

“电商兴农 走进柳湖”明天赵堡准时启动,邀您一起来采摘

为了进一步推动农村电子商务普及应用&#xff0c;营造农村电商发展浓厚氛围&#xff0c;培育电商新业态、新模式&#xff0c;宣传推广崆峒农特产品&#xff0c;推动城乡生产与消费有效对接&#xff0c;拓宽农特产品销售渠道&#xff0c;释放农村消费潜能&#xff0c;挖掘乡村文…

凡图公益行|温暖新庞村:“守护童心、预防霸凌”公益活动圆满落幕!

凡图公益行|温暖新庞村&#xff1a;“守护童心、预防霸凌”公益活动圆满落幕&#xff01; 在当今社会&#xff0c;霸凌这一现象如同阴霾般笼罩在部分孩子的生活之中&#xff0c;成为了一个不容忽视的社会问题。 它不仅给受害者带来深重的身心伤害&#xff0c;还对整个社会的和…

Haption力反馈设备在核工业遥操作机器人中的应用探讨

核工业作为能源领域的重要组成部分&#xff0c;其安全性和工作效率的提升越来越受到人们的关注。在核工业环境中&#xff0c;由于存在高辐射、高风险等特性&#xff0c;传统的人工操作方式并不适用于该领域&#xff0c;因此遥操作机器人技术应运而生。Haption力反馈设备作为虚拟…

springboot报错

springboot报错&#xff1a;g.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 解决办法&#xff1a; file->settings 搜索encoding 然后选择File encodings 也可以直接找 File encodings 全部都更改整utf-8&#xff…

Midjourney咒语之风景大片极简抽象神秘特效

风景大片 Himalayas, landscape, very detailed, --ar 16:9 --style raw --v 5.1 Serene blue mountains landscape. hills, mist, morning fog, Wide-angle lens, Low ISO, EOS 5D Mark IV, --ar 16:9

Vue2中渲染功能,添加功能,删除功能,统计功能

上述是代码运行结果&#xff0c;完整代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

防近视台灯有效果吗?家长们要注意台灯怎么选才靠谱

近年来&#xff0c;电子产品的广泛应用进一步加重了学生的用眼负担。平板电脑、智能手机和笔记本电脑成为日常学习不可或缺的一部分&#xff0c;而长时间使用这些设备无疑加剧了视力疲劳。根据权威机构的预测&#xff0c;到2050年&#xff0c;全球近视人数将达到约49.49亿人&am…

Spring Boot 动态数据源

目录 前言 前置环境 pom yml Entity Dao 枚举类 数据源 AOP Controller 启动类 演示 前言 大多数系统中&#xff0c;都需要数据库来持久化数据&#xff0c;在大多数情况下&#xff0c;一个系统只需要配置一个数据源便能够完成所有业务的查询&#xff0c;保存操作。…