Git 内幕:.git 目录

April 13, 2014 @ 02:33 PM

目的

学习有关 .git 目录结构的内容。

.git 目录

是时候做些浏览了。首先,从你的项目根目录开始……

$ ls -C .git
$ ls -C .git
COMMIT_EDITMSG  ORIG_HEAD   hooks       logs        rr-cache
HEAD        config      index       objects
MERGE_RR    description info        refs

这是全部 Git 东东所存储的魔法目录。让我们一瞥对象目录。

对象存储

$ ls -C .git/objects
$ ls -C .git/objects
09  1f  27  43  69  83  97  af  e4  info
0f  22  28  58  6b  94  9c  b5  e7  pack
11  24  32  59  78  96  a1  c4  eb

你应当看到一串包含两个字符名称的目录。目录名称是 Git 中 对象存储的 sha1 哈希的开头两个字符。

深入对象存储

$ ls -C .git/objects/<dir>
$ ls -C .git/objects/09
6b74c56bfc6b40e754fc0725b8c70b2038b91e  9fb6f9d3a104feb32fcac22354c4d0e8a182c1

看看两字符目录的其中之一。你应当看到一些具有 38 个字符 名称的文件。这些是 Git 中包含对象存储的文件。这些文件 已被压缩和编码,所以直接查看它们的内容并没有什么用处, 但我们将看一点。

配置文件

$ cat .git/config
$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[user]
    name = Jim Weirich
    email = jim (at) neo.com

这是项目级配置文件。在这儿的配置条目将覆盖你的主目录 中 .gitconfig 文件中的配置条目,至少对此项目来说是如 此。

分支与标签

$ ls .git/refs
$ ls .git/refs/heads
$ ls .git/refs/tags
$ cat .git/refs/tags/v1
$ ls .git/refs
heads
tags
$ ls .git/refs/heads
master
$ ls .git/refs/tags
v1
v1-beta
$ cat .git/refs/tags/v1
1f7ec5eaa8f37c2770dae3b984c55a1531fcc9e7

你应当认识标签子目录中的文件。每个文件都与你先前使用 git tag 命令所创建的标签相应。它的内容是绑定到标签 的提交哈希。

heads 目录与此相似,但它是用于分支而非标签。现在我 们只有一个分支,所以你在该目录中只会看到 master。

HEAD 文件

$ cat .git/HEAD
$ cat .git/HEAD
ref: refs/heads/master

HEAD 文件包含当前分支的引用。此刻它是对于 master 的引用。