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

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

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

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