Git仓库有两种不同的形式
(1)项目仓库:<project>/.git
执行git init命令初始化本地仓库时,Git会自动创建一个.git子目录(隐藏目录)。这个目录包含了几乎所有Git存储和操作的东西。 如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。
$ git init git-project
$ tree git-project --noreport --dirsfirst -F -f -a
git-project
`-- git-project/.git/
|-- git-project/.git/hooks/
| |-- git-project/.git/hooks/applypatch-msg.sample
| |-- git-project/.git/hooks/commit-msg.sample
| |-- git-project/.git/hooks/post-update.sample
| |-- git-project/.git/hooks/pre-applypatch.sample
| |-- git-project/.git/hooks/pre-commit.sample
| |-- git-project/.git/hooks/pre-push.sample
| |-- git-project/.git/hooks/pre-rebase.sample
| |-- git-project/.git/hooks/prepare-commit-msg.sample
| `-- git-project/.git/hooks/update.sample
|-- git-project/.git/info/
| `-- git-project/.git/info/exclude
|-- git-project/.git/objects/
| |-- git-project/.git/objects/info/
| `-- git-project/.git/objects/pack/
|-- git-project/.git/refs/
| |-- git-project/.git/refs/heads/
| `-- git-project/.git/refs/tags/
|-- git-project/.git/HEAD
|-- git-project/.git/config
`-- git-project/.git/description
(2)裸仓库(bare repository): <project>.git
裸仓库是一个没有工作目录的仓库,仅存放Git相关资料。裸仓库作为合作媒介,不需要从磁盘检查快照。裸仓库的目录名以.git 结尾,相当于cp -Rf my_project/.git my_project.git。
$ git init --bare git-bare.git
$ tree git-bare.git/ --noreport --dirsfirst -F -f -a
git-bare.git
|-- git-bare.git/hooks/
| |-- git-bare.git/hooks/applypatch-msg.sample
| |-- git-bare.git/hooks/commit-msg.sample
| |-- git-bare.git/hooks/post-update.sample
| |-- git-bare.git/hooks/pre-applypatch.sample
| |-- git-bare.git/hooks/pre-commit.sample
| |-- git-bare.git/hooks/pre-push.sample
| |-- git-bare.git/hooks/pre-rebase.sample
| |-- git-bare.git/hooks/prepare-commit-msg.sample
| `-- git-bare.git/hooks/update.sample
|-- git-bare.git/info/
| `-- git-bare.git/info/exclude
|-- git-bare.git/objects/
| |-- git-bare.git/objects/info/
| `-- git-bare.git/objects/pack/
|-- git-bare.git/refs/
| |-- git-bare.git/refs/heads/
| `-- git-bare.git/refs/tags/
|-- git-bare.git/HEAD
|-- git-bare.git/config
`-- git-bare.git/description
下面对一些重要目录和文件进行简单描述,其他目录和文件含义详见官方说明或git help gitrepository-layout。
-
.git/hooks/:钩子脚本,用于在特定事件发生时执行自定义动作。把不带扩展名且可执行的文件放入.git/hooks中即可激活该钩子脚本
-
.git/info/:仓库的其他信息
info/exclude---排除文件规则,与.gitignore功能类似
-
.git/logs/:对引用所做的更改记录。git reflog
-
.git/objects/:对象文件,即对象数据库(Object Database)
objects/[0-9a-f]{2}/[0-9a-f]{38}---哈希文件(基于zlib压缩的全量数据),文件名由SHA-1哈希值决定(前2个字符作为子目录名,后38个字符作为文件名),又称为松散对象(loose object)
objects/pack---打包文件(增量数据),又称为打包对象(packed object)。git gc
objects/info---存储对象的其他信息
-
.git/refs/:引用文件
refs/heads/---本地仓库的分支(例如master)
refs/remotes/---远程仓库的分支(例如origin)
refs/tags/---本地仓库的标签
-
.git/COMMIT_EDITMSG:包含正在进行提交的提交消息。git commit
-
.git/HEAD:符号引用(symbolic reference),指向当前分支
-
.git/ORIG_HEAD:执行特定命令时备份HEAD。git am, git merge, git rebase, git reset
-
.git/FETCH_HEAD:从远程仓库抓取的分支。git fetch
-
.git/config:仓库的配置选项。git config –local -l
-
.git/description:仓库的描述信息,仅供GitWeb程序使用(通过Web页面查看git内容)。git instaweb --start
-
.git/index:索引文件(二进制文件),也称为暂存区(Staging Area)。git ls-files --stage
参考资料
gitrepository-layout - Git Repository Layout
gitrevisions - Specifying revisions and ranges for Git
gitformat-pack - Git pack format