git第一次commit代码阅读
获取 git 第一次commit
获取对应tag
在github的Switch branches/tags选择对应tag
或者
克隆下整个git项目,执行
git tag
查看所有tag.
git checkout <tag-version>
切换到对应tag.
阅读README
介绍了git来源于get的误读
介绍了设计上的两个抽象
-
object database
-
current directory cache
对象
Tree:
存放所提交的文件列表,文件列表每一行描述所记录的一个文件,包括:文件的权限、路径名、SHA1值。
这个就能够用于保存每一次提交的具体内容,通过查询tree文件,可以知道该次提交时所含有的所有文件,然后根据每一个文件的SHA1,可以在object database中搜索出该文件。这样就达到了保存每一次提交的具体内容的目的。
BLOB:
blob文件是指具体的文件内容,即我们所提交的文件。
Blob文件会被压缩,然后计算SHA1值,所以如果文件的内容没有发生变化,那么就不会产生新的Blob文件。因为它们算出的SHA1是相同的,而SHA1值就是它们实际的存放路径。
Commit:
commit文件是用于记录每一次提交的文件。包含的内容有:tree、parents、author、committer、changelog。其中tree是指用于保存此次提交的tree文件。Parents是指此次提交的父分支是哪些,也是对应的tree文件。Author、committer、changelog是提交的记录信息。
对象间关系
一个commit 包含 tree对象,author, commiter, log-info,
tree对象中又包含许多blob 对象
阅读代码
编译项目
环境wsl-ubuntu
安装zlib开发包
sudo apt install zlib1g-dev
安装openssl开发包
sudo apt install libssl-dev
修改编译选项, 将Makefile中LIBS= -lssl修改为LIBS= -lcrypto -lz
执行make后,会获得7个可执行文件
代码阅读
工具
查看函数依赖关系
基于makefile建立依赖关系
之后的发展
为了将可执行文件进行统一管理,git进行了分层设计,底层使用C实现的管道系统,高层为使用shell脚本实现的瓷器系统(即用户使用的接口)
随着指令的进一步增加,一些脚本命令通过向c生成的git程序传参实现了。例如git-commit.sh在这个版本被替换为C实现。