Git 仓库目录 .git 详解

举报
Linux猿 发表于 2021/08/04 23:16:48 2021/08/04
【摘要】   目录 一、实例环境 二、目录结构 2.1 branches 目录 2.2 COMMIT_EDITMSG 文件 2.3 config 文件 2.4 description 文件 2.5 HEAD文件 2.6 hooks 目录 2.7 index 文件 2.8 info 目录 2.9 logs 目录 2...

  目录

一、实例环境

二、目录结构

2.1 branches 目录

2.2 COMMIT_EDITMSG 文件

2.3 config 文件

2.4 description 文件

2.5 HEAD文件

2.6 hooks 目录

2.7 index 文件

2.8 info 目录

2.9 logs 目录

2.10 objects 目录

2.11 refs 目录

三、参考文献


Git 在创建仓库的时候会在当前仓库目录下创建名为 .git 的隐藏目录,用于存储仓库配置以及数据信息。本文将结合实例对 Git 仓库的基本目录进行介绍。

一、实例环境

下文中的实例均是在如下环境中进行的:

系统环境:CentOS Linux release 7.6.1810 (Core)

git版本:git version 1.8.3.1

远程仓库:GitHub。

二、目录结构

初始化仓库使用 git init 命令,初始目录(.git)结构如下所示:


  
  1. [root@192 testgit]# tree .git
  2. .git
  3. ├── branches
  4. ├── config
  5. ├── description
  6. ├── HEAD
  7. ├── hooks
  8. │ ├── applypatch-msg.sample
  9. │ ├── commit-msg.sample
  10. │ ├── post-update.sample
  11. │ ├── pre-applypatch.sample
  12. │ ├── pre-commit.sample
  13. │ ├── prepare-commit-msg.sample
  14. │ ├── pre-push.sample
  15. │ ├── pre-rebase.sample
  16. │ └── update.sample
  17. ├── info
  18. │ └── exclude
  19. ├── objects
  20. │ ├── info
  21. │ └── pack
  22. └── refs
  23. ├── heads
  24. └── tags
  25. 9 directories, 13 files
  26. [root@192 testgit]#

 这个初始化后的仓库,当创建完分支 dev-branch,并 push 后,目录结构如下所示:


  
  1. [root@192 testgit]# tree .git/
  2. .git/
  3. ├── branches
  4. ├── COMMIT_EDITMSG
  5. ├── config
  6. ├── description
  7. ├── HEAD
  8. ├── hooks
  9. │ ├── applypatch-msg.sample
  10. │ ├── commit-msg.sample
  11. │ ├── post-update.sample
  12. │ ├── pre-applypatch.sample
  13. │ ├── pre-commit.sample
  14. │ ├── prepare-commit-msg.sample
  15. │ ├── pre-push.sample
  16. │ ├── pre-rebase.sample
  17. │ └── update.sample
  18. ├── index
  19. ├── info
  20. │ └── exclude
  21. ├── logs
  22. │ ├── HEAD
  23. │ └── refs
  24. │ ├── heads
  25. │ │ ├── dev-branch
  26. │ │ └── master
  27. │ └── remotes
  28. │ └── origin
  29. │ └── master
  30. ├── objects
  31. │ ├── 2d
  32. │ │ └── d2c71b69c837a7459f4bd9c9f7db6520731d06
  33. │ ├── 5c
  34. │ │ └── 7b8eda18a75e13d27c31e65a54b0abd7948510
  35. │ ├── 77
  36. │ │ └── cad3aecf7c2754231095598119979d62a1e1da
  37. │ ├── info
  38. │ └── pack
  39. └── refs
  40. ├── heads
  41. │ ├── dev-branch
  42. │ └── master
  43. ├── remotes
  44. │ └── origin
  45. │ └── master
  46. └── tags
  47. 19 directories, 25 files
  48. [root@192 testgit]#

接下来将会对各个目录以及文件进行详细的介绍。

2.1 branches 目录

一种不常用的存储速记方式,用于指定git fetch,git pull和git push的URL,目前已基本不用。

2.2 COMMIT_EDITMSG 文件

把大写变成小写就容易理解了,commit_editmsg :commit 编辑信息,仅记录最近一次提交的 commit 编辑信息,例如:


  
  1. [root@192 testgit]# vim README
  2. [root@192 testgit]# git add .
  3. [root@192 testgit]# git commit -m "modify README file"
  4. [master 2392c4d] modify README file
  5. 1 file changed, 2 insertions(+), 1 deletion(-)
  6. [root@192 testgit]# git push origin master
  7. Counting objects: 5, done.
  8. Delta compression using up to 2 threads.
  9. Compressing objects: 100% (2/2), done.
  10. Writing objects: 100% (3/3), 315 bytes | 0 bytes/s, done.
  11. Total 3 (delta 0), reused 0 (delta 0)
  12. To git@github.com:New-World-2019/testgit.git
  13. 3cbe67c..2392c4d master -> master
  14. [root@192 testgit]# cat .git/COMMIT_EDITMSG
  15. modify README file
  16. [root@192 testgit]#

上述例子中,先修改了 README 文件,然后 push 到远程,在 commit 时写了 “modify README file”,之后查看 COMMIT_EDITMSG文件存储的即为提交时的备注信息。 

2.3 config 文件

看名字就知道了,存储当前仓库的配置信息。git 的配置文件分为三层,分别是:

  1. /etc/gitconfig 文件:系统上每一个用户及他们仓库的通用配置;
  2. ~/.gitconfig 或 ~/.config/git/config 文件:当前用户的仓库配置;
  3. .git/config 文件(当前仓库下):当前用户当前仓库的配置;

最下层的优先级最高,会覆盖上层的配置信息,可以通过 git config 参数对上述文件进行修改,可配置的信息包括:用户信息、http 信息、仓库信息等。


  
  1. [root@192 testgit]# cat ~/.gitconfig
  2. [user]
  3. name = New-World-2019
  4. email = acmerzhangxipeng@163.com
  5. [http]
  6. postBuffer = 1048576000
  7. lowSpeedLimit = 0
  8. lowSpeedTime = 999999
  9. [root@192 testgit]# cat .git/config
  10. [core]
  11. repositoryformatversion = 0
  12. filemode = true
  13. bare = false
  14. logallrefupdates = true
  15. [remote "origin"]
  16. url = git@github.com:New-World-2019/testgit.git
  17. fetch = +refs/heads/*:refs/remotes/origin/*
  18. [branch "master"]
  19. remote = origin
  20. merge = refs/heads/master
  21. [branch "dev-branch"]
  22. remote = origin
  23. merge = refs/heads/dev-branch
  24. [root@192 testgit]# git config --list
  25. user.name=New-World-2019
  26. user.email=acmerzhangxipeng@163.com
  27. http.postbuffer=1048576000
  28. http.lowspeedlimit=0
  29. http.lowspeedtime=999999
  30. core.repositoryformatversion=0
  31. core.filemode=true
  32. core.bare=false
  33. core.logallrefupdates=true
  34. remote.origin.url=git@github.com:New-World-2019/testgit.git
  35. remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
  36. branch.master.remote=origin
  37. branch.master.merge=refs/heads/master
  38. branch.dev-branch.remote=origin
  39. branch.dev-branch.merge=refs/heads/dev-branch
  40. [root@192 testgit]#

在上面例子中, 系统中没有创建 /etc/gitconfig 文件便没有打印出来。可以看出的是,在当前仓库下 git config --list 命令的结果为文件 ~/.gitconfig 和 .git/config 的和。如果需要了解更多配置信息,可以通过 git config 命令进一步了解。

2.4 description 文件

用于在 GitWeb 中展示项目的描述信息。默认内容如下:

Unnamed repository; edit this file 'description' to name the repository.
 

2.5 HEAD文件

存储 HEAD 指针,指向当前分支,即:记录当前活动分支,例如:


  
  1. [root@localhost testgit]# git status
  2. # 位于分支 master
  3. 无文件要提交,干净的工作区
  4. [root@localhost testgit]# cat .git/HEAD
  5. ref: refs/heads/master
  6. [root@localhost testgit]# git checkout dev-branch
  7. 切换到分支 'dev-branch'
  8. [root@localhost testgit]# cat .git/HEAD
  9. ref: refs/heads/dev-branch
  10. [root@localhost testgit]#

在上述例子中,开始是在 master 分支,切换到 dev-branch 分支后,文件 .git/HEAD 的内容变成了 refs/heads/dev-branch。

2.6 hooks 目录

目录下存储了许多钩子文件(一些脚本),这些文件是各种 Git 命令使用的自定义脚本,可以在Git 特定阶段自动执行,例如:提交 (commit)、变基 (rebase)、拉取 ( pull ) 操作的前后执行。运行 git init 时会安装一些示例钩子,但是默认情况下它们都被禁用。如果要启用,需要删除文件.sample后缀。

2.7 index 文件

暂存区(stage),二进制文件。

2.8 info 目录

存储库的其他信息将记录在此目录中。

info/exclude :  忽略指定模式的文件,和 .gitignore 类似,但是 .gitignore 是针对每个目录的。

2.9 logs 目录

保存所有更新的引用记录。其目录结构如下:


  
  1. [root@localhost logs]# tree
  2. .
  3. ├── HEAD
  4. └── refs
  5. ├── heads
  6. │ ├── dev-branch
  7. │ └── master
  8. └── remotes
  9. └── origin
  10. ├── dev-branch
  11. └── master
  12. 4 directories, 5 files
  13. [root@localhost logs]#

其中,HEAD 记录所有更改记录,包括切换分支,logs/refs 下存储本地和远程分支的更改记录。 

2.10 objects 目录

Git 是一个内容寻址文件系统,Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。

简单理解就是:objects 目录是 Git 的数据库(键值对数据库,可以想象为 map[key] = value 的形式),根据 key 来存取内容,key 即为 SHA1计算后的值。该目录下存储有三种对象(最多):数据对象(blob object)、树对象(tree object)、提交对象(commit object)。

(1)info 和 pack 目录

当存储的文件很大时,git 会进行压缩,会存储到 info 和 pack 下;

(2)2个字符命令的目录

首先,这两个字母是计算的SHA1值(总共40个字符)的前两个字符,剩余的38个是该目录下的文件名。

2.11 refs 目录

(1)heads 目录

目录有以各个本地分支名命名的文件,保存对应分支最新提交的ID,是通过SHA1算法计算的一个字符串。

(2)remotes 目录

目录有以各个远程分支名命名的文件,保存对应分支最新提交的ID,和 heads 目录一个原理。

(3)tags 目录

存储在开发过程中打的标签,里面的文件以标签名命令,文件内容为对应的ID。

三、参考文献

[1] What is Git's description file?

[2] gitignore

[3] git branches

[4] gitrepository-layout

 

 

 

 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/109406589

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。