• home > tools > versionControl > git >

    Git内部原理:微型文件系统与内容寻址系统(转载)

    Author:zhoulujun Date:

    感觉这篇文章写的比较好,所以转载了。Git是版本控制系统、微型文件系统、内容寻址系统。Git的底层是一个微型内容寻址系统Git在1 5版本是一个分水岭,1 5之前更偏向文件系统,1 5版本后更偏向版本控制系统

    Git是版本控制系统、微型文件系统、内容寻址系统。

    Git的底层是一个微型内容寻址系统Git在1.5版本是一个分水岭,1.5之前更偏向文件系统,1.5版本后更偏向版本控制系统

    git底层原理


    Git常用命令共有30多个,可运行git help查看;但Git总共有130多个命令,可以通过git help -a查看,这些命令可以分为高层命令和底层命令,底层命令被设计成unix风格,不常用

    Git仓库下有一个.git目录,里面存储了git全部的秘密,一般包括下面的内容:

    • config

    • index

    • HEAD

    • hooks/

    • logs/

    • refs/

    • objects/


    config

    config是仓库的配置文件,一个典型的配置文件如下,我们创建的远端,分支都在配置文件里有表现;  fetch操作的行为也是在这里配置的

    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = [email protected]:yanhaijing/zepto.fullpage.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    [branch "dev"]
        remote = origin
        merge = refs/heads/dev

    objects

    git通过一种算法可以得到任意文件的指纹(40位16进制数字),然后通过文件指纹存取数据,存取的数据都位于objects目录

    git Object对象解析

    objects目录下有3种类型的数据:

    • Blob

    • Tree

    • Commit

    文件都被存储为blob类型的文件,可以通过内部命令hash-object写入数据

    echo 'test content' | git hash-object -w --stdin
    d670460b4b4aece5915caf5c68d12f560a9fe3e4

    然后通过cat-file取出数据

    $ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
    test content

    文件夹被存储为tree类型的文件,文件内容如下所示

    git cat-file -p 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0
    100644 blob 47c6340d6459e05787f644c2447d2595f5d3a54b      simplegit.rb

    一般我们系统中的目录,在git中会像下面这样存储

    git文件系统与git文件系统

    创建的提交节点被存储为commit类型数据,commit文件的内容如下

    $ git cat-file -p fdf4fc3
    tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
    author Scott Chacon <[email protected]> 1243040974 -0700
    committer Scott Chacon <[email protected]> 1243040974 -0700
    
    first commit

    有三个提交的Git仓库可简化为下图所示

    refs

    refs目录存储都是引用文件,如本地分支,远端分支,标签等

    • refs/heads/xxx 本地分支

    • refs/remotes/origin/xxx 远端分支

    • refs/tags/xxx 本地tag

    引用文件的内容都是40位commit

    上面只有提交的图补上分支后,如下所示

    HEAD文件存储的是当前所在的位置,其内容可以使分支名字,40位commit ID

    $ cat HEAD
    refs/heads/master

    上面的图补上HEAD后,如下所示:



    继续学习



    转载本站文章《Git内部原理:微型文件系统与内容寻址系统(转载)》,
    请注明出处:https://www.zhoulujun.cn/html/tools/VCS/git/9062.html