使用git init
命令创建本地仓库时会自动创建一个.git
目录,此目录存储了所有项目历史数据和元信息。
|-- hooks
|-- applypatch-msg.sample
|-- commit-msg.sample
|-- fsmonitor-watchman.sample
|-- post-update.sample
|-- pre-applypatch.sample
|-- pre-commit.sample
|-- pre-merge-commit.sample
|-- prepare-commit-msg.sample
|-- pre-push.sample
|-- pre-rebase.sample
|-- pre-receive.sample
|-- push-to-checkout.sample
|-- update.sample
|-- info
|-- exclude
|-- refs
|-- logs
|-- refs
|-- heads
|-- master
|-- HEAD
|-- objects
|-- info
|-- pack
|-- refs
|-- heads
|-- master
|-- tags
|-- COMMIT_EDITMSG
|-- config
|-- description
|-- HEAD
|-- index
一、hooks
存放 git 提交的各阶段文件,用于在 git 命令前后执行检查和一些自定义操作。
二、info
-
info/exclude
git init
初始化时只生成这个文件,用于排除提交规则,与.gitignore
功能类似,区别在于.gitignore
文件会被提交到版本库中,团队共享排除提交规则,而info/exclude
只影响本地,不影响团队其他人,此文件也不会被提交到版本库中。 -
info/refs
如果新建了分支就会生成info/refs
文件,用于跟踪各分支信息。此文件需要使用git update-server-info
命令生成,内容如下:
9b9f52c2c2d8f5dbdec959f7e468649c3802dd39 refs/heads/develop
9b9f52c2c2d8f5dbdec959f7e468649c3802dd39 refs/heads/master
git clone
执行后会获取info/refs
文件,info/refs
文件中记录了远端仓库的所有分支和引用信息。
三、logs
保存所有更新操作的引用记录,主要用于git reflog
。
四、objects
git init
初始化时会在objects
目录下生成两个空文件夹:info
和pack
,执行git add
命令后文件就会存入objects
。
五、refs
refs
下有两个文件夹heads
和tags
:
heads
存储对分支的引用,一般由git branch
命令生成。tags
存储对标签的引用,一般由git tag
命令生成。
|-- refs
|-- heads
|-- develop
|-- master
|-- tags
|-- 0.1.0
|-- 1.0.0
六、COMMIT_EDITMSG
存储最后一次 Commit 时的 Message 信息。
七、config
记录项目配置信息,git config
命令会改动此文件内容。
[core]
repositoryformatversion = 0
# 如果为 true 则当文件权限发生变化时也算作文件差异。
filemode = false
# 裸仓库,`git init`初始化时可以加上`--bare`决定是否创建一个裸仓库。
# 普通 git 仓库中有 .git 文件夹用以存储所有项目历史数据和元信息以便构建工作副本。
# 裸仓库没有 .git 文件夹,会把初始化的文件或文件夹直接放在项目根目录中。
bare = false
logallrefupdates = true
symlinks = false
# 忽略文件大小写,如果为 true 则当文件名称出现大小写变化时,git 会忽略此变化。
ignorecase = true
八、description
记录项目描述信息,用于 GitWeb,通过浏览器访问可以查看项目描述(Description)。
九、HEAD
存储当前位置指针指向当前工作区所在分支。
ref: refs/heads/master
十、index
暂存区,也成为 stage,是一个索引文件。执行git add
命令后文件会存入 Git objects 中,并使用索引进行定位。index
是一个二进制文件,无法直接用文本编辑器查看,可以使用git ls-files --stage
命令查看。
PS D:\...> git ls-files --stage
100644 043a3b46337b46164a5626816c2984b48be968ea 0 A.txt
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 B.md
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 build.sh