首页 » IT » git目录布局

git目录布局

config - logs - hooks -

git通常作为隐藏目录存在(.git/),它的结构如下:

$ ls .git/
branches  COMMIT_EDITMSG  config  description  HEAD  hooks  index  info  logs  objects  refs

首先看几个直接位于.git/路径下的文件:

.git/COMMIT_EDITMSG - 最近一次运行git commit时附加的消息。

.git/config - 当前git仓库的配置文件

.git/description - 当前git仓库的描述。

.git/HEAD - 当前git仓库的最新版本,它的内容通常是:

ref: refs/heads/master

.git/index - 一个二进制的索引文件。

再看.git/路径下的子目录。

git配置文件

git配置文件分布在几个地方

  • /etc/gitconfig - 对应git config --system
  • ~/.gitconfig - 对应git config --global
  • .git/config - 对应当前项目

使用以下命令可以查看git配置:

$ git config --list             # 全局配置和当前项目
$ git config --list --global    # 全局配置
$ git config --list --local     # 当前项目

以下是一个.git/config文件的内容

$ less .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = git@github.com:berlinix/codes.git
[branch "master"]
        remote = origin
        merge = refs/heads/master

这是一个托管在GitHub的项目。config文件中,注释符是#和;。config文件被分为很多段(section),段又分为子段(subsection),格式为:

[section "subsection"]

section不区分大小写,但subsection区分大小写。还有一种不推荐的老式写法是section.subsection。一个section中的其他行的格式为:name = value。以下是常见的一些选项:

remote.<name>.url - 远端仓库的URL。上例中是GitHub的URL地址:git@github.com:berlinix/codes.git

remote.<name>.fetch - refspec默认值(供git fetch用)。refspec的格式为一个可选的+号(有+表示即使不能快速演进,也要强制更新),接着是src:dst的格式。src指远端引用格式,dst指将要记录在本地的引用格式。通常refspec由git remote add自动生成,git会获取远端refs/heads/下所有引用,并将之写入到本地的refs/remotes/origin/。

.git/logs

.git/logs/HEAD

.git/logs/HEAD每一行都是一个操作记录,格式是:

from-id to-id author <email> timestamp operation: comments

实例如下:

$ less .git/logs/HEAD   
0000000000000000000000000000000000000000 f79ea4897ba7fc3208e49812cca69d99c069f700 
       commit (initial): add libs
...
5ae373a7a261a823aa342d8b880b73009c3b0af1 5ae373a7a261a823aa342d8b880b73009c3b0af1 
       checkout: moving from master to exp
5ae373a7a261a823aa342d8b880b73009c3b0af1 7bac64b181e8562e35e140e67d5a1df1f45f0732 
       commit: add update record file
7bac64b181e8562e35e140e67d5a1df1f45f0732 5ae373a7a261a823aa342d8b880b73009c3b0af1 
       checkout: moving from exp to master
5ae373a7a261a823aa342d8b880b73009c3b0af1 7bac64b181e8562e35e140e67d5a1df1f45f0732 
       merge exp: Fast-forward
...

以上包含了如切换(git checkout)、合并(git merge)分支等操作。

.git/logs 下的其他子目录

.git/logs/refs/heads/master     -> master分支日志
.git/logs/refs/heads/exp        -> 一个名为exp的分支日志

.git/logs/refs/remotes              -> remote日志
.git/logs/refs/remotes/dev/master   -> 一个名为dev的remote的master分支

这些具体的日志信息,与.git/logs/HEAD日志极为相似,通过每行的ID信息,可以完全还原这个git仓库上的所有操作。

.git/hooks

当使用git init初始化一个git仓库时,hooks路径就被创建,且携带了数个示例hooks。这些hooks以.sample最为后缀:

$ ls .git/hooks/
applypatch-msg.sample  post-update.sample     pre-commit.sample          pre-rebase.sample
commit-msg.sample      pre-applypatch.sample  prepare-commit-msg.sample  update.sample

用git发布网站一节中,使用了一个名为hooks/post-receive的钩子,来自动同步网站文件。

分享

0