目的

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

.git 目录

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

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

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

对象存储

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

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

深入对象存储

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

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

配置文件

  1. $ cat .git/config
  1. $ cat .git/config
  2. [core]
  3. repositoryformatversion = 0
  4. filemode = true
  5. bare = false
  6. logallrefupdates = true
  7. ignorecase = true
  8. [user]
  9. name = Jim Weirich
  10. email = jim (at) neo.com

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

分支与标签

  1. $ ls .git/refs
  2. $ ls .git/refs/heads
  3. $ ls .git/refs/tags
  4. $ cat .git/refs/tags/v1
  1. $ ls .git/refs
  2. heads
  3. tags
  4. $ ls .git/refs/heads
  5. master
  6. $ ls .git/refs/tags
  7. v1
  8. v1-beta
  9. $ cat .git/refs/tags/v1
  10. 1f7ec5eaa8f37c2770dae3b984c55a1531fcc9e7

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

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

HEAD 文件

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

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