探索.git目录
.git目录
下面就开始进入.git目录,通过“ls”命令可以看到.git目录中的文件和子目录:
对于这些文件和目录,下面给出了一些基本的描述。
- hooks:这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他git托管系统会经常用到hook script
- info:包含仓库的一些信息
- logs:保存所有更新的引用记录
- objects:所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
- refs:这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit
- COMMIT_EDITMSG:保存最新的commit message,Git系统不会用到这个文件,只是给用户一个参考
- config:这个是GIt仓库的配置文件
- description:仓库的描述信息,主要给gitweb等git托管系统使用
- index:这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
- HEAD:这个文件包含了一个档期分支(branch)的引用,通过这个文件Git可以得到下一次commit的parent
- ORIG_HEAD:HEAD指针的前一个状态
Git引用
Git中的引用是一个非常重要的概念,对于理解分支(branch)、HEAD指针以及reflog非常有帮助。
Git系统中的分支名、远程分支名、tag等都是指向某个commit的引用。比如master分支,origin/master远程分支,命名为V1.0.0.0的tag等都是引用,它们通过该保存某个commit的SHA1哈希值指向某个commit
重新认识HEAD
HEAD也是一个引用,一般情况下间接指向你当前所在的分支的最新的commit上。HEAD跟Git中一般的引用不同,它并不包含某个commit的SHA1哈希值,而是包含当前所在的分支,所有HEAD直接执行当前所在的分支,然后间接指向当前所在分支的最新提交。
为了更形象的解释上面的描述,我们首先查看“.git/HEAD”的内容:
这就表示HEAD是一个指向master分支的引用,然后我们可以根据引用路径打开“refs/heads/master”文件,内容如下:
根据前面一片文章的介绍,我们通过这个哈希值查看对象的类型和雷人,可以看到这个哈希值对应着一个commit,并通过“git log”可以发现这个commit就是master分支上最新的提交。
所以可以看到,所有的内容都是环环相扣的,我们通过HEAD找到一个当前分支,然后通过当前分支的引用找到最新的commit,然后通过commit可以找到整个对象关系模型,看下图:
引用和分支
直到现在我们都没有开始介绍分支(branch),先大概展示一下引用和分支的关系。
假设我们现在除了master分支,又创建了一个release-1.0.0.1的分支,再次查看“.git/refs/heads/”目录,可以看到除了master文件之外,又多了一个release-1.0.0.1文件,查看该文件的内容也是一个哈希值。
通过“git show-ref --heads”命令就可以查看所有的头,这些都是HEAD的候选值:
HEAD文件的内容是commit的分支,当我们把分支切换到release-1.0.0.1的时候,HEAD文件的内容也会相应的变成:
ref: refs/heads/release-1.0.0.1
日志
我们进入“.git/logs”文件夹,可以看到这个文件夹也有一个HEAD文件和refs目录,这些就是记录commit历史记录的地方。我们可以通过commit的哈希值,把repo退到一个指定的状态。
Git索引index
前面文章我们也提到过index/stage,就是更新的暂存区,下面来看看index文件。
index(索引)是一个存放了已排序的路径的二进制文件,并且每个路径都对应一个SHA1哈希值。在Git系统中,可以通过“git ls-files --stage”来显示index文件的内容:
从命令的输出可以看到,所有的记录都对应仓库中的文件(包含全路径)。上面显示的哈希值就是abc.txt的blob对象的哈希值。
现在我们更新abc.txt文件,并通过“git add”添加到暂存区,这时发现index中的abc对象的哈希值已经变化了。
对象的存储
前面提到所有的Git对象都会存放在“.git/objects”目录中,对象SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名。下面是之前提到的master最新的commit对象的哈希值:
63a6ea8475b47078dee14ea8ff2c8731927ffbbf
在Git系统中有两种对象存储的方式,松散对象存储和打包对象存储
松散对象(loose object)
松散对象存储就是前面提到的,每一个对象都被写入一个单独文件中,对象SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名。
打包对象(packed object)
对应松散存储,把每个文件的每个版本都作为一个单独的对象,它的效率比较低,而且浪费空间。所以就有了通过打包文件(packfile)的存储方式。
Git使用打包文件(packfile)去节省空间。在这个格式中,Git只会保存第二个文件中改变的部分,然后用一个指针指向相似的那个文件。
一般Git系统会自动完成打包的工作,在已经发生过打包的Git仓库中,object/pack目录下回成对出现很多“pack-***.idx”和“pack-***.pak”文件。
探索.git目录的更多相关文章
- Git Step by Step – (4) 探索.git目录
前面一篇文章介绍了Git对象模型,接下来我们就进入".git"目录看看到底有什么东西,目录中哪些东西又跟Git对象模型相关.结合这个目录,我们将进一步了解Git的工作原理. .gi ...
- 【Git】将项目下的.git目录隐藏
将项目下的.git目录隐藏 在apache配置文件httpd.conf中添加配置: <Directory "${INSTALL_DIR}/www/mypro/.git"> ...
- 在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的 在删除掉/home/git目录后,每次 git push提交时,都让填写密码,烦 第一步:在本地找到id_rsa ...
- 4. git目录探秘
HEAD当前指向的分支信息.cconfig,当前仓库的配置信息,core,用户,远程,分支等信息.(命令操作其实就是修改当前config文件)refs---heads,其实就是分支,里面包含所有的分支 ...
- Mac上如果看不到.git目录的解决方法
Mac OS X上,如果需要查看.git目录下的隐藏文件,操作很简单: 做法是:打开一个Terminal终端窗口,输入: defaults write com.apple.finder AppleSh ...
- 深入理解git,从研究git目录开始
转发学习的啦. 似乎很少有人在读某个git快速教程的时候会说:“这个关于git的快速教程太酷了!读完了用起git来超级舒服,并且我一点也不怕自己会破坏什么东西.” 对git的初学者来说,刚接触git时 ...
- .git 目录文件介绍
$>tree -L 1.|-- HEAD # 这个git项目当前处在哪个分支里|-- config # 项目的配置信息,git config命令会改动它|-- des ...
- Git——简说.git目录【五】
我们都知道初始化项目时,会生成一个.git的隐藏目录,那么这个目录究竟放了那些东西呢,又有什么作用呢?现在我们就来看看. HEAD HEAD指向的是当前工作所在的分支 $ cat HEAD ref: ...
- [转发]深入理解git,从研究git目录开始
转发学习的啦. 似乎很少有人在读某个git快速教程的时候会说:“这个关于git的快速教程太酷了!读完了用起git来超级舒服,并且我一点也不怕自己会破坏什么东西.” 对git的初学者来说,刚接触git时 ...
随机推荐
- sql 、linq、lambda 总结
LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量中被查询的值 [group by 条件] Lambda ...
- BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets
考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况. 然后将后一半的状态按照和排序,$O(2^ ...
- android布局详解
http://blog.163.com/zhangzheming_282/blog/static/117920962013072502787/ AbsoluteLayout——绝对布局 必 ...
- hdu1710 Binary Tree Traversals(二叉树的遍历)
A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjo ...
- SphinxSE 一些SQL查询语句
1.查询STRUCTURE_ID=106562并且COL1=2 或者 COL1=0 或者 COL2=2,对TS进行排序,从第10条开始取1000条. SELECT ID FROM T_RESOURCE ...
- Leetcode Combination Sum
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- 【JAVA】Math.Round()函数常见问题“四舍5入”
java.lang.Math.Round()使用时候,处理方式整理,方便以后查找 /** * 测试函数 2014-01-10 */ public class TestMath { pu ...
- BZOJ1025: [SCOI2009]游戏
Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...
- 测试简单for循环的效率
os : CentOS 5.2 代码:test-usecond.c #include <stdio.h> #include <sys/time.h> // for gettim ...
- lua日期与时间操作
os.date("%Y%m%d%H%M%S", os.time()) <== 20160405141211 yyyyMMddHHmmss os.time() ...