探秘.git目录

探秘.git目录

十月 21, 2019

探秘.git目录

在此之前,提一下gitk命令,gitk会调出一个git图形界面工具,不具体赘述,可以自己查看。

HEAD文件

首先打开.git目录

$ cd .git/ #在git工程主目录下打开.git目录,.git是个隐藏目录
$ ls -la
total 56
drwxr-xr-x 15 jamme staff 480 5 14 22:49 .
drwxr-xr-x 5 jamme staff 160 4 29 22:10 ..
-rw-r--r-- 1 jamme staff 9 4 29 22:12 COMMIT_EDITMSG
-rw-r--r-- 1 jamme staff 21 4 29 22:08 HEAD
-rw-r--r-- 1 jamme staff 41 4 29 21:31 ORIG_HEAD
drwxr-xr-x 2 jamme staff 64 4 28 22:08 branches
-rw-r--r-- 1 jamme staff 191 4 28 22:10 config
-rw-r--r-- 1 jamme staff 73 4 28 22:08 description
-rw-r--r-- 1 jamme staff 375 5 14 22:49 gitk.cache
drwxr-xr-x 13 jamme staff 416 4 28 22:08 hooks
-rw-r--r-- 1 jamme staff 201 4 29 22:12 index
drwxr-xr-x 3 jamme staff 96 4 28 22:08 info
drwxr-xr-x 4 jamme staff 128 4 28 22:19 logs
drwxr-xr-x 20 jamme staff 640 5 14 22:53 objects
drwxr-xr-x 4 jamme staff 128 4 28 22:08 refs
$ cat HEAD #查看HEAD文件,会发现他是个引用,指向temp分支
ref: refs/heads/temp
$ git branch -av #查看分支 *代表当前在哪个工作分支
master 4d2bddd rename
* temp 543c5d8 add test
$ cd .. #切换到主目录下
$ git checkout master #切换master分支
Switched to branch 'master'
$ cat .git/HEAD #重新查看HEAD文件,发现引用已经指向了master
ref: refs/heads/master

config文件

$ cat .git/config 
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = xxx
email = xxx@xxx.com
$ vi .git/config #修改user.name
$ git config --local --list #查看local config 发现name已经变了
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
user.name=jamme
user.email=xxx@xxx.com
$ git config --local user.name #用这种方式查看name
jamme
$ git config --local user.name 'xxx' #修改name
$ git config --local user.name #查看 修改成功
xxx
$ cat .git/config #再查看config文件 也发生变化
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = xxx
email = xxx@xxx.com

refs目录

$ cd .git/refs/
$ ls -la
total 0
drwxr-xr-x 4 jamme staff 128 4 28 22:08 .
drwxr-xr-x 15 jamme staff 480 5 14 23:14 ..
drwxr-xr-x 4 jamme staff 128 4 29 22:12 heads #分支
drwxr-xr-x 3 jamme staff 96 5 14 22:53 tags #tag标签
$ cd heads/
$ ls -la
total 16
drwxr-xr-x 4 jamme staff 128 4 29 22:12 .
drwxr-xr-x 4 jamme staff 128 4 28 22:08 ..
-rw-r--r-- 1 jamme staff 41 4 29 21:36 master #master分支
-rw-r--r-- 1 jamme staff 41 4 29 22:12 temp #temp分支
$ cat master
4d2bdddf4098e40ce57fdaf04bb862f7bea04918
$ git cat-file -t 4d2bdddf4098e40ce57fda #查看引用的object是什么类型 这里是commit类型
commit
$ git branch -av
* master 4d2bddd rename #看到这里master指向的地址就是上边master文件中存储的地址
temp 543c5d8 add test
$ cat temp #temp文件中存储的地址和上方temp分支指向的地址是一样的 如果较短的hash值可以表示唯一 就可以使用短hash值
543c5d84e8b5f2996e1a40745262f39df95eebaf
$ cd ../tags/ #进入refs目录下的tags目录
$ ls -la
total 8
drwxr-xr-x 3 jamme staff 96 5 14 22:53 .
drwxr-xr-x 4 jamme staff 128 4 28 22:08 ..
-rw-r--r-- 1 jamme staff 41 5 14 22:53 test
$ cat test #查看test文件中存储的地址
0eaa4776504680c4df3677d5d66a7f4b8f0c5ffe
$ git cat-file -t 0eaa47765 #查看该地址指向的对象类型 tag类型
tag
$ git cat-file -p 0eaa47765 #查看该地址指向对象的内容
object d34df54beffb33cf6e4f4e97d0f0e24f2b676d51
type commit
tag test
tagger xxx <xxx@xxx.com> 1557845639 +0800

tag test
$ git cat-file -t d34df5 #上边地址指向tag对象的内容中 存储的类型实际上是个commit
commit

objects目录

$ cd objects/	#切换到.git目录下的objects目录
$ ls -la
total 0
drwxr-xr-x 20 jamme staff 640 5 14 22:53 .
drwxr-xr-x 15 jamme staff 480 5 14 23:14 ..
drwxr-xr-x 3 jamme staff 96 5 14 22:53 0e
drwxr-xr-x 3 jamme staff 96 4 28 22:19 33
drwxr-xr-x 3 jamme staff 96 4 29 21:36 4d
drwxr-xr-x 3 jamme staff 96 4 29 22:12 54
drwxr-xr-x 3 jamme staff 96 4 29 20:48 5d
drwxr-xr-x 3 jamme staff 96 4 29 20:48 64
drwxr-xr-x 3 jamme staff 96 4 29 21:02 85
drwxr-xr-x 3 jamme staff 96 4 29 20:47 8b
drwxr-xr-x 3 jamme staff 96 4 29 20:47 90
drwxr-xr-x 3 jamme staff 96 4 29 22:12 9c
drwxr-xr-x 3 jamme staff 96 4 29 21:36 9f
drwxr-xr-x 3 jamme staff 96 4 29 22:12 c9
drwxr-xr-x 3 jamme staff 96 4 29 21:02 d3
drwxr-xr-x 3 jamme staff 96 4 29 21:05 dd
drwxr-xr-x 3 jamme staff 96 4 28 22:17 e6
drwxr-xr-x 3 jamme staff 96 4 28 22:19 e8
drwxr-xr-x 2 jamme staff 64 4 28 22:08 info
drwxr-xr-x 2 jamme staff 64 4 28 22:08 pack #如果上边的松散文件夹比较多的情况下 git会自动把他们打包到pack目录下
$ cd e8/ #进入e8目录
$ ls -la
total 8
drwxr-xr-x 3 jamme staff 96 4 28 22:19 .
drwxr-xr-x 20 jamme staff 640 5 14 22:53 ..
-r--r--r-- 1 jamme staff 51 4 28 22:19 0ad49ace82167de62e498622d70377d913c79e #这个文件名拼上目录名就是一个地址
$ git cat-file -t e80ad49ace82167de62e498622d70377d913c79e #查看该地址的类型 是一棵树
tree
$ git cat-file -p e80ad49ace82167de62e498622d70377d913c79e #查看该地址的内容 blob是文件 文件名叫readme
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 readme
$ git cat-file -t e69de29bb2d1d64 #看一下类型 确实是blob
blob
$ git cat-file -p e69de29bb2d1d64 #查看内容 就是文件内写入的内容
sssssss

git中有一个神奇的地方,只要任何文件的文件内容相同,那么在git的眼里就是一个唯一的blob。