add file.

This commit is contained in:
lisonwu
2025-05-09 14:02:27 +08:00
commit 4234b3686f
+24
View File
@@ -0,0 +1,24 @@
# 从Git的内部实现到理解unix编程思想
在软件工程领域,软件工程师们根据需求定制开发一套软件。在这个开发过程中,工程师们或多或少都会遇到各种问题,例如需求变更,测试bug,性能瓶颈等。
这时候的软件开发就需要一个迭代开发的流程。软件版本管理软件就是为了管理和记录这个迭代开发的过程,记录每次开发变更的内容和原因,以方便追朔各种
软件的开发历史。Git 可以说是在软件工程领域非常流行的版本管理软件,它的优秀是从作者设计它思路体现出来的。
首先我们从Git内部的数据存储看看它是怎么管理不同本版数据的。我们可以想象到如果刚开始创建一个文本文件,写了些内容到文件里面,然后把这个文件提交
到Git去存储。那Git软件会怎么存储这个文件和管理他的后续变更内容呢?是简单复制一个文件重复命名文件名还是其他更好的方式。这时Git软件采用的是最简
单的方式,它把提交的文件内容看成是纯二进制数据,根据这个二进制数据生成一个SHA算法的key值。这样通过key-value的映射关系就可以找到提交文件的内容
了。这就是Git存储数据最基本的对象--blob object。假设我们的文件目录增加了一个文件,而我们需要记录这个目录下的文件,那Git是如何记录这种变跟行为
的呢?Git 用一种新的对象类型代表这个目录--tree object。树结构本身可以包含子树和子叶,这样和目录里的子目录和子文件可以很好的一一映射出来。当
我们提交一个变跟到Git时,这个变跟包含有文件内容和子目录,这时候Git产生一个新的object类型,commit object。这个commit object有点类是于相机的snapshot,
这commit object 记录所用当前时间点需要记录的blob object和tree object和产生这个commit的说明。这样查找历史版本记录,就通过这个查找这个commit object
就可以找到需要的历史版本了。看似复杂的数据存储管理,Git从自然界的树获取的数据模型,建立起来管理文件变更的目录结构,再采用快照的方式把变跟记录下来,
体现了unix设计的kiss原则--keep it simple and stupid 。
然而事情还没有结束,这个软件版本管理的数据存储部分解决了。还有我们怎么提交文件给版本管理软件,怎么产生这些这些储存数据对象,如何查找这些数据,怎么解析这些数据对象呢?
如果我们把所有功都实现在一个软件工具里--我们这里称它为BigGit,我们可以现象这个软件工程有多么复杂,既要实现产生数据,用要实现数据的查选和解些,即使能实现,也不好独立管理。
相比BigGit,实际的Git软件采用的功能拆分的,一个独立工具实现一个对立功能的方式,在把各个工具接口以字符串交互的方式联合起来实现一个完整的Git版本管理软件。
例如如何给一个文件产生一个blob object,这里就有一个独立工具git hash-object; 如果要产生一个tree-object,则有一个git write-tree工具; 如果要读一个object内容,则有一个
git cat-file 工具。这样通过一个一个功能独立的工具组合成功能强大的Git软件版本管理软件,这体现了unix例外一个设计思想--do one thing and do it well。
最后总结下,一个软件版本管理软件看似需求复杂多变的东西,实际把许多功能剥离出来后,例如GUI,网路链接等,我们看到其本质功能是数据以一种好的方式存储和查询。
这样把一个软件核心功能变得简单,软件开发就可以聚焦在这里,以变开发出来的软件高效和稳定,后续的功能可以在这个基础上增加和扩增,不会引申影响到原来的核心功能。