.git 文件夹结构解析
在这篇文章就让我们来看看这个 Git 仓库里的文件分别都是用来干什么的,以及在执行了相关的 Git 命令后这些文件会如何响应。
- hooks(钩):存放一些shell脚本
- info:存放仓库的一些信息
- logs:保存所有分支的 commit 记录及 HEAD 操作记录。
- HEAD:映射到 refs 引用,这样就能够找到当前分支最新的一次提交的 hash 值。
- objects:存放所有的git对象
- refs:
-
- heads:保存所有分支中当前最新的一次提交的 hash 值
-
- remotes:保存所有远程仓库的所有分支当前最新的一次提交的 hash 值。
-
- tags:保存所有标签对应的提交的 hash 值。
- COMMIT_EDITMSG:最新提交的一次Commit Message,git系统不会用到,给用户一个参考
- description:仓库的描述信息,主要给gitweb等git托管系统使用
- config:当前git仓库的配置文件
- index:存储暂存区(staging area)的信息
- FETCH_HEAD: 是一个版本链接,指向着目前已经从远程仓库取下来的分支最新的一次提交的 hash 值
- HEAD:映射到 refs 引用,能够找到当前分支最新的一次提交的 hash 值
- ORIG_HEAD: 执行 pull 或者 merge 后会将当前分支最新的一次提交的 hash 值留在 ORIG_HEAD。
config
通过 git config 命令进行配置。
我们先执行看看 config 文件里有什么配置:
之后我们执行 git config 配置一些用户信息:
git config user.name "dralexsander"
不能携带 --global 参数,否则就会修改到全局的配置
此时我们执行 git config -l 查看所有的配置可以发现当前项目的配置和全局配置合并到一起打印出来。
如果我们需要切换用户,就可以通过 git config 进行配置。
objects
存放所有的git对象。
git的对象分为以下四种类型:
- blob:缓存区的具体文件内容
- tree:缓存区的文件的文件夹名及对应的 blob 对象
- commit:提交的 commit 信息及 tree(root tree) 对象
- tag:对应的 commit hash(在 .git/refs/tag 文件夹里)
上面的几种类型不需要强行硬背,阅读完下面的部分想必大家都能轻易理解。
我们在执行 git init 后,objects 文件夹里只存在 info、pack 两个空文件。
当我们在根目录下输出下面的命令创建一个 file1.txt 文件,并输入 hello git; 作为内容。
echo hello git; > file1.txt
然后执行 git add . 命令将 file1.txt 文件放入暂存区:
git add .
此时我们看看 objects 文件夹中多了个名为 76 的文件夹
该文件夹里的存在一个 31bcb57512d5989050a08d7c507c8db7eebf8f 文件
我们在通过 git add 命令将文件存入暂存区时,都会将文件的内容中取出,通过内容产生一组 SHA1 哈希值,然后依照这个 SHA1 哈希值命名的一个文件并放入 objects 文件夹中。这个文件就是 「blob 对象」。
Git 仓库中的每一个「对象」,都是以「文件内容」进行 SHA1 哈希运算出一个 hash 值,并用这个 hash 值当作对象的名称 (文件夹名)。我们以 7631bcb57512d5989050a08d7c507c8db7eebf8f 为例,Git 会先拿前两个字元(92)当作目