Git是如何保存文件名和目录关系的---树对象

2024-06-19 20:04

本文主要是介绍Git是如何保存文件名和目录关系的---树对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

树对象(tree)—— 保存文件名和目录关系

树对象主要解决2个问题,:文件名的保存和文件目录关系的保存

就像下面这样

下面我们就来模拟一下构建上面这颗树,也就是模拟保存这3个文件,其中的"bak"是一个目录,下面有一个文件

首先可以看到,我们一共需要保存的是3个文件,new.txt 、 内容为version 2的 test.txt 和内容为version 1的 test.txt。其中我们上面已经把version 1的 test.txt写入到Git仓库了。

Git是怎么创建树对象的呢?

Git 根据某一时刻暂存区(即 index 区域)所表示的状态创建并记录一个对应的树对象,如此重复便可依次记录(某个时间段内)一系列的树对象。而暂存区里保存就是我们add进去的文件和目录。

而我们之前的text.txt是直接存入到Git数据库里面了,没有在暂存区,所以先要把这个文件读到暂存区里来

我们可以用 update-index 命令更新暂存区(跟我们做git add 操作是一样的道理)

git update-index --add --cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt
  • add :表示写入,因为文件不在暂存区中
  • cacheinfo:表示是从Git数据库中取文件,因为我们的文件不在工作目录,而是在Git数据库中
  • 100644:表示是普通文件,此外还有100755,表示一个可执行文件;120000,表示一个符号链接
  • 后面就是文件的SHA-1值和文件名

好的,现在我们已经把前面的内容更新到暂存区了。

然后我们就可以用 write-tree 命令生成一个树对象

git write-tree
//输出
d8329fc1cc938780ffdd9f94e0d364e0ea74f579

我们可以验证一下它确实是一个树对象(git cat-file -t命令可以查看对象的类型):

git cat-file -t d8329fc1cc938780ffdd9f94e0d364e0ea74f579
//输出
tree

经过上面的步骤,我们就把右边的那个树对象创建完毕了。

实际上,上面已经解决了一个问题,就是文件名的保存。

git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579
//输出
100644 blob 83baae61804e65cc73a7201a7252750c76066a30	test.txt

这里我们再快速创建剩下的部分,直接新建new.txt和更新text.txt,然后用git add添加到暂存区并生成一个新的树对象

echo 'new file' > new.txt
echo 'version 2'> text.txt
git add .
git write-tree

下面我们来看看怎么解决目录保存的问题,也就是树和树关联起来

//首先把前面的把那个树对象写入到暂存区,其中bak就表示目录名
git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579
//然后生成一个新的树对象
git write-tree
//输出
9f2f42e85a6648e5b5f48e1a6f154999e06b9a31

然后我们就可以来看看这个新的树对象了:

git cat-file -p 9f2f42e85a6648e5b5f48e1a6f154999e06b9a31
//输出
040000 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579	bak
100644 blob fa49b077972391ad58037050f2a75f74e3671e92	new.txt
100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a	text.txt

可以看到,目录就对应一个树对象,这样保存目录的问题就解决了。

数据对象和树对象用于保存数据和文件名和目录,我们还需要记录是谁保存的这些数据以及时间和原因等信息,而这些信息就需要第三个对象——提交对象。下一次我们就来看看提交对象


欢迎关注我的公众号查看更多精彩文章!

AntDream

这篇关于Git是如何保存文件名和目录关系的---树对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076008

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的