分布式的版本管理同svn集中式版本管理不同的是,本地维护一个版本库,所以不需要联网服务器就可以做开发版本管理。每个开发者对自己仓库拥有写权限,而对其他所有人仓库的读权限。同时有个代表“官方”项目的权威的仓库。
在工程会有个管理仓库的文件夹.git。这个git保存了版本管理的所有数据。今天就来探秘这个.git文件夹的设计思想。
git clone xxxx 克隆一个远端分支会产生一个./git/config。一个最简config配置如下:
core存的是与分支无关的配置
[remote "origin"]和[branch "master"]指的是本地如何与远程仓库做交互。
[remote]的url选项指定远程拉取地址,fetch的字符串格式是 “+源分支:目的分支"。比如说例子的fetch = +refs/heads/*:refs/remotes/origin/*,意思是refs/heads/目录下的任意分支最新commit都关联到:refs/remotes/origin/*的同名文件。
[branch]使用remote指定master分支关联到remote/origin分支。merge指定了要merge的源。
这两个配置跟git fetch、git pul命令有关系,这两个命令就是在这个配置找映射关系。比如说
在refs文件夹存在着3个子文件夹,分别是:
git branch创建一个分支(git branch tmp),这里其实就是在ref/heads创建一个文件,这个文件内容是个当前commit id。ref是描述当前仓库所有本地分支,每一个文件名对应相应的分支,文件内部存储了当前分支最新的commit hash值。因此新建分支,只要往.git/refs/heads/分支名写入commit hash值就是这么简单。
没被关联的分支执行fetch会报错
git定义的object有3种角色:commit、tree、blob。角色类型可以用git cat-file -t <commit id>找到。角色间的关系如下:commit对应一个tree,tree里面可以包含另一个tree,tree的叶子节点是一个blob,blog代表这个文件的某个版本状态。
白色的节点是blob,blob存储存储的是文件的内容,只要文件内容一样是,不管文件名不一样,blob一样的,这是git的一个设计特点。同一个文件有不同的状态,用version区分,tree表示的git当时的一个快照状态。这个状态描述了各个文件的状态。
tree是文件夹,blob是文件
存放文件内容的object,unpacked或者loss 对象,这些对象放在256个子目录。子目录名的前两个字母是commit id的头两个字母,commit id剩下的字符串作为文件名字。
钩子函数脚本用于自定义一些git命令执行时候触发的脚本
比如commit、applypatch、push、rebase被执行会触发相关脚本。要使这些生效,把文件的sample后缀去掉
logs目录夹存储refs文件夹的改变,这些日志包括commit关联关系、提交人、提交时间等,执行git reflog命令可以管理查看这些log
是个git效能优化的文件,文件包含索引并且压缩object,能达到随机访问对象.
branch和tag的变更(统称为 ref)是每个ref在目录下的(子)目录中存储一个文件$GIT_DIR/refs 。尽管许多分支往往会经常更新,但是大多数tag和某些分支从未更新。当存储库具有成百上千个ref时,这种“每个引用一个文件”的格式既浪费存储空间,又损害性能。pack文件夹正是为了解决这个问题而生。
此命令用于通过将ref存储在单个文件中来解决存储和性能问题 $GIT_DIR/packed-refs。当传统$GIT_DIR/refs目录层次结构中缺少ref时,将在此文件中查找该引用并在找到后使用。
分支的持续commit总是在$GIT_DIR/refs目录层次结构下创建新文件 。有过多ref的存储库的做法是将其ref打包--all一次,并偶尔运行git pack-refs。根据定义,tag是固定的,并且不会更改。branch头将带有首字母pack-refs --all,但只有当前分支head将被解包,而下一个pack-refs(不带--all)将使它们解包。
存储额外扩展信息
info/exclude用于配置本地分支的 例外文件夹,该文件夹不会被git仓库管理。.和gitignore的区别在于,exclude只在本地分支生效,不会被同步到 远端的repo。
index是个二进制文件夹,对应着暂存区。暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。暂存区保存元数据包括时间戳、文件名、SHA id。
git reset HEAD^
modules包含了第三方的库,比如一个工程包含了另一个repo
decription用于git在web界面用于搜索
git是Linux出自同一作者。git的设计者应用现在编程的很多思想。
头指针:HEAD指针,当前仓库所在的commit位置。
git的gc:清理commit,请求文件object
git的文件管理:一个object代表着一个文件的一种版本。
git的缓存:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。