Git知识点:仓库布局

189 阅读2分钟

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

Specifies intentionally untracked files to ignore

【Git】.git 文件夹探秘,理解 git 运作机制