git第一次commit代码阅读

获取 git 第一次commit

git log --reverse 倒叙查看日志

获取满足范围的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个可执行文件

代码阅读

工具

查看函数依赖关系

GNU cflow

基于makefile建立依赖关系

makefile2graph

之后的发展

为了将可执行文件进行统一管理,git进行了分层设计,底层使用C实现的管道系统,高层为使用shell脚本实现的瓷器系统(即用户使用的接口)

git design

随着指令的进一步增加,一些脚本命令通过向c生成的git程序传参实现了。例如git-commit.sh在这个版本被替换为C实现。

shell script converted to C

参考

fabiensanglard

如何阅读源代码-zhangguixv

Git源码学习

posted @ 2020-08-07 21:05  amonqsq  阅读(318)  评论(0编辑  收藏  举报