Git源码(Linus 2005 年提交的最初版本)阅读笔记

news2024/11/27 2:34:54

Linus 发疯文学欣赏

Git 是 Linux 之父 Linus Torvalds 于2005年开发的用于帮助管理 Linux 内核开发的开源版本控制软件
美好的一天从阅读 Linus 的发疯文学开始。
(1) Linus 教你学习 Git

(2) Linus 评价 CVS (Concurrent Version System)

(3) 独一无二的 Linus

调侃结束,开始看代码


一、切换分支,make 和阅读 README

执行如下命令( checkout 后面那一串是第一次commit计算出来的哈希值),切换到最初版本的 git 分支。

$ git clone https://github.com/git/git.git
$ git log --reverse
$ git checkout e83c5163316f89bfbde7d9ab23ca2e25604af290 

来自地狱的管理器,emmm,好中二啊救命:)

1.1 成功 make all

毕竟 Linus 老爷子开发的时候是2005年,一些库函数、编译器配置可能已经过时了。
(1)修改 Makefile 中的 LIBS 配置如下

LIBS = -lz -lcrypto

(2)安装函数库

sudo apt install zlib1g-dev
sudo apt install libssl-dev

(3)修改 cache.h 文件
将 61~63 行的变量声明加上 extern 关键字,不然 make 时会出现 “multiple definition” 错误。

extern const char *sha1_file_directory;
extern struct cache_entry **active_cache;
extern unsigned int active_nr, active_alloc;

最后在 Makefile 所在文件夹下执行 make all 即可,生成如下七个可执行文件

  1. cat-file
  2. commit-tree
  3. init-db
  4. read-tree
  5. show-diff
  6. update-cache
  7. write-tree

1.2 README

Linus 可以说是在到处发癫,即使在 README 中也如此,他首先解释了一下为啥取名 Git 。

GIT - the stupid content tracker
“git” can mean anything, depending on your mood. ("git"叫啥取决于你的心情)

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronounciation of “get” may or may not be relevant.(未被 UNIX 系统使用的命令名,也可能是对 get 的错误发音,目前一切正常)
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.
  • “global information tracker”: you’re in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room. (心情不错时它是好的信息追踪器,天使在唱歌,阳光撒遍房间)
  • “goddamn idiotic truckload of sh*t”: when it breaks.(它没用时,白痴般的粪车)

二、按照执行顺序,解读7个可执行文件

2.1 init-db(相当于 git init)

$ ./init-db
defaulting to private storage area

defaulting 是执行 init-db 的输出语句,表示默认在当前目录下创建文件夹 " .dircache/objects/ " 。在 Linux 中以“.”开头的文件为隐藏文件。
文件名的来源是在 cache.h 中定义的两个宏

#define DB_ENVIRONMENT "SHA1_FILE_DIRECTORY"
#define DEFAULT_DB_ENVIRONMENT ".dircache/objects"

对于第一个宏,Linus 的解释是,若希望多个分支共享一个数据库区域(DB area),即不同分支经 SHA1 计算后的哈希值保存在同一个目录中,可以配置这个宏。好处是节省了空间,坏处是让查找效率降低。默认做法还是在当前文件夹下新建 " .dircache/objects/ " 文件夹。

// C语言中创建文件夹也是 mkdir,sha1_dir 就是 ".dircache/objects/",0700 是权限信息
// 创建成功返回 0,失败返回 -1
if (mkdir(sha1_dir, 0700) < 0) {
	if (errno != EEXIST) {
		perror(sha1_dir);
		exit(1);
	}
}

在 " .dircache/objects/ " 文件夹下还有从 00~ff 共256个文件夹,每个分支的哈希值计算完后取前两位,对应到指定的文件夹中。

for (i = 0; i < 256; i++) {
	sprintf(path+len, "/%02x", i);	// x表示16进制,02表示结果为两位,不够的在前补0
	if (mkdir(path, 0700) < 0) { ... }
}

创建成功后的效果

🔎 插曲:cache.h 和 read-cache.c

源码中的所有的 C 文件都 #include "cache.h ",read-cache.c 则实现 cache.h 中声明的函数,初始化声明的变量,因此放在一起说。

2.2 update-cache(相当于 git add)

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

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

相关文章

手把手教你写一个生成yapi接口代码Chrome 扩展插件

前言 公司想开发个公众号&#xff0c;想在公众号里做业务&#xff0c;也不是做小程序&#xff0c;但是以后也可能做小程序。emm&#xff0c;就是这么随意。所以就找个到了uniapp&#xff0c;说是可以开发一套代码&#xff0c;多平台运行。开发语法还是vue&#xff0c;感觉也没…

RabbitMQ消息队列——快速入门

目录 1、MQ介绍 1.1、什么是MQ&#xff1f; 1.2、MQ的能够解决的问题 1.2.1、削峰填谷 1.2.3、异步处理 1.3、MQ的选择 1.3.1、Kafka 1.3.2、ActiveMQ 1.3.3、RocketMQ 1.3.4、RabbitMQ 2、RabbitMQ的介绍 2.1、RabbitMQ的概述 2.2、AMQP 2.3、JMS 2.4、RabbitMQ…

关系抽取:传统:UniRel: Unified Representation and Interaction for Joint Relational

针对传统下的三元组抽取提出的一种方法&#xff0c;在NYT和webNLG数据集上&#xff0c;再次刷新榜单。 本来对这个结果不是很确定&#xff0c;但作者公布了源码&#xff0c;we can reformulate it . 很少在看到这种文章了吧。 Core idea 换了一种解释思路。 从entity-entity的…

ARM汇编之乘法指令

ARM汇编之乘法指令前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; 乘法指令有哪些种类呢&#xff1f;ARM乘法指令具体的使用场景又有哪些&#xff1f; 今天&#xff0c;我们来一起探索并回答这些问题。为了便于大家理解&#xff0c;以下是本文的…

精准诊断,精确治疗,智芯传感ZXPA侵入式压力传感器为心血管疾病患者带来福音

近日&#xff0c;据联合国《世界人口展望2022》报告显示&#xff0c;地球人口已正式步入“80亿时代”&#xff01;人口数量增加&#xff0c;从一个侧面反映了人类文明的进步。此外&#xff0c;随着人类预期寿命增加&#xff0c;加上生育率下降&#xff0c;将加剧全球人口老龄化…

基于模型的聚类和R语言中的高斯混合模型

介绍 四种最常见的聚类方法模型是层次聚类&#xff0c;k均值聚类&#xff0c;基于模型的聚类和基于密度的聚类 . 最近我们被客户要求撰写关于聚类的研究报告&#xff0c;包括一些图形和统计输出。 可以基于两个主要目标评估良好的聚类算法&#xff1a; 高组内相似性低组间相…

小程序中的自定义组件以及组件通信、数据共享、插槽、behaviors

一、创建组件和使用自定义组件 1.创建组件 ①在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建components -> 文件夹 ②在新建的components -> 文件夹上,鼠标右键&#xff0c;点击“新建Component ③键入组件的名称之后回车&#xff0c;会自动生成组件对应的4个…

卡尔曼滤波Kalman Filtering:介绍

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 控制理论(control theory&#xff09;是工程学的分支之一&#xff0c;主要应对工程系统控制的问题。比如控制汽车发动机的功率输出&#xff0c;稳定电动机的转速&#xff0c;控制“反应速率”&#x…

企业数字化办公利器——华为云桌面Workspace

随着云办公生态的逐渐成熟&#xff0c;华为云桌面也成为了越来越多企业实现随时随地移动办公的选择。 华为云桌面Workspace是一款SAAS产品&#xff0c;是基于华为云云原生架构设计和构建的云桌面服务&#xff0c;可支持云桌面的快速创建、部署和集中运维管理&#xff0c;免除大…

2023年java代做题目参考整理

为方便毕业设计选题&#xff0c;特别整理以下几百题目供参考 班级风采网站的设计 工资绩效管理系统的开发 电子产品销售网站的设计与实现 酒店预订信息管理系统的设计 成绩管理系统 B2C的电子商务系统(J2EE) B2C购物网站设计 教学网站及网上考试系统的设计与实现 ERP采…

STM32学习之Keil5软件配置

前言&#xff1a;代码编写环境可以让编写者在代码编写上有一定的好处&#xff0c;从而得到高效的代码编写。本次笔者写的是一些市面上常用的嵌入式开发软件Keil5&#xff0c;在初始化使用软件界面需要进行配置的。主要分为五大部分&#xff08;文本美化、代码编辑技巧、查找和替…

一篇图解Linux内存碎片整理

我们知道物理内存是以页为单位进行管理的&#xff0c;每个内存页大小默认是4K&#xff08;大页除外&#xff09;。申请物理内存时&#xff0c;一般都是按顺序分配的&#xff0c;但释放内存的行为是随机的。随着系统运行时间变长后&#xff0c;将会出现以下情况&#xff1a; 要解…

树莓派板载蓝牙使用

1 设置树莓派板载蓝牙 1.1 相关环境安装、配置 sudo apt-get update sudo apt-get install pi-bluetooth bluez bluez-firmware blueman1.2 树莓派蓝牙操作 参考&#xff1a; https://blog.csdn.net/guzhong10/article/details/78574577 有时候会失败&#xff0c; 可以尝试…

[附源码]SSM计算机毕业设计学校缴费系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

文件包含总结

概念 是指将已有的代码以文件形式包含到某个指定的代码中&#xff0c;从而使用其中的代码或者数据&#xff0c;一般是为了方便直接调用所需文件&#xff0c;文件包含的存在使得开发变得更加灵活和方便。 文件包含常见函数 include() // 执行到include时才包含文件&#xff…

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作”

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作” 之前我们已经说了对线段树的点更新和区间查询&#xff0c;若要求对区间中的所有点都进行更新&#xff0c;该怎么办&#xff1f; 若对区间的每个点都进行更新&#xff0c;则时间复杂度较高&#xff0c;可以引入懒…

Cocos2d-x 3D渲染技术 (三)

包围盒算法 说白了就是给物体装进一个盒子里&#xff0c;该盒子可以装下物体。目的是为了进行碰撞检测。 种类&#xff1a; 球状碰撞体立方体碰撞体胶囊碰撞体Mesh碰撞体 实现原理是OBB包围盒。 经常使用的两种碰撞算法是OBB包围盒和AABB包围盒算法。 OBB包围盒算法 方向…

JavaScript -- 01. 基础语法介绍

文章目录基础语法1 Hello World2 JS的编写位置3 基本语法3.1 多行注释3.2 单行注释3.3 区分大小写3.4 空格和换行会被忽略3.5 以分号结尾3.6 字面量3.7 变量3.8 变量的内存结构3.9 常量3.10 标识符基础语法 JS的基本语法 1 Hello World js的三种输出方式 <!DOCTYPE html&g…

精彩回顾 | 云原生系统软件的产业应用

11月18日&#xff0c;2022年第五届中国金融科技产业大会暨第四届中新&#xff08;苏州&#xff09;数字金融应用博览会“基础软件与云原生系统软件”分论坛成功举办。该论坛由由中国计算机学会CTO CLUB&#xff08;苏州&#xff09;承办&#xff0c;江苏省金融科技云原生融合创…

如何用 Python 做一个简单的翻译工具?

前言 平时经常在网上翻译一些单词&#xff0c;突发奇想&#xff0c;可不可以直接调某些免费翻译网站的接口呢&#xff1f;然后做一个图形界面的翻译小工具&#xff1f;下面开始实践 &#xff08;文末送读者福利&#xff09; 1.先找一下有哪些免费翻译的接口 百度了一下关键字…