git内部原理

git内部原理

1. git本质

从根本上来讲 Git 是一套内容寻址 (content-addressable) 文件系统,在此之上提供了一个 VCS 用户界面。
从内部来看,Git 是简单的 key-value 数据存储。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。

运行 git add 和 git commit 命令时 Git 进行的工作。
保存修改了的文件的blob,更新索引,创建 tree 对象,最后创建 commit 对象,这些 commit 对象指向了顶层tree 对象以及先前的 commit 对象。这三类 Git 对象 blob,tree 以及 tree 都各自以文件的方式保存在 .git/objects 目录下。


1.1 .git目录结构

Administrator@6XIGRIJ0JJDRMSP MINGW64 /e/guotengfei/git/VerifyServices/.git (GIT_DIR!)
$ ll
total 35
-rw-r--r-- 1 Administrator 197121   97 二月  9 15:09 COMMIT_EDITMSG
-rw-r--r-- 1 Administrator 197121  382 一月 29 14:47 config
-rw-r--r-- 1 Administrator 197121   73 一月 29 13:52 description
-rw-r--r-- 1 Administrator 197121  226 二月  9 14:59 FETCH_HEAD
-rw-r--r-- 1 Administrator 197121   24 二月  9 14:54 HEAD
drwxr-xr-x 1 Administrator 197121    0 一月 30 10:15 hooks/
-rw-r--r-- 1 Administrator 197121 3601 二月  9 15:09 index
drwxr-xr-x 1 Administrator 197121    0 一月 29 13:52 info/
drwxr-xr-x 1 Administrator 197121    0 一月 29 13:52 logs/
drwxr-xr-x 1 Administrator 197121    0 二月  9 14:57 objects/
-rw-r--r-- 1 Administrator 197121   41 二月  9 14:57 ORIG_HEAD
-rw-r--r-- 1 Administrator 197121  183 一月 29 13:52 packed-refs
drwxr-xr-x 1 Administrator 197121    0 二月  9 14:57 refs/

description GITWEB使用
config 保存项目特有配置
info目录保存了一份不希望在 .gitignore 文件中管理的忽略模式 (ignored patterns) 的全局可执行文件
hooks 客户端或服务端钩子脚本
objects 目录存储所有数据内容
refs 目录存储指向数据 (分支) 的提交对象的指针
HEAD 文件指向当前分支
index 文件保存了暂存区域信息
packed-refs 运行 git gc, refs 下的所有文件都会消失。Git 会将这些文件挪到 .git/packed-refs 文件中去以提高效率
logs/ 保存reflog 数据

refs目录结构

Administrator@6XIGRIJ0JJDRMSP MINGW64 /e/guotengfei/git/VerifyServices/.git/refs (GIT_DIR!)
$ ll
total 1
drwxr-xr-x 1 Administrator 197121  0 二月  9 15:09 heads/
drwxr-xr-x 1 Administrator 197121  0 一月 29 13:52 remotes/
-rw-r--r-- 1 Administrator 197121 41 二月  9 14:57 stash
drwxr-xr-x 1 Administrator 197121  0 一月 29 13:52 tags/

heads 本地分支
remotes 远程分支
tags 标签
stash 储藏


2. git对象磁盘保存

Git 往磁盘保存对象时默认使用的格式叫松散对象 (looseobject) 格式。Git 时不时地将这些对象打包至一个叫 packfile 的二进制文件以节省空间并提高效率。当仓库中有太多的松散对象,或是手工调用 git gc 命令,或推送至远程服务器时,Git 都会这样做。Git 自动定期对仓库进行重新打包以节省空间。

$ git gc
Counting objects: 285, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (277/277), done.
Writing objects: 100% (285/285), done.
Total 285 (delta 150), reused 17 (delta 0)

git fsck 工具,该工具会检查仓库的数据完整性。如果指定 –full 选项,该命令显示所有未被其他对象引用 (指向) 的所有对象.

 $ git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (285/285), done.
dangling blob 455067f1ef13e36817289b26e1e7f1c117618045
dangling tree 78b871161fbcef6f8f47d0fc0ed77b810ea97f95
dangling blob c058f2f0773d7a0ff7ea47221746462edc711147
dangling commit dea4608db554a36718182bb6a0c86d7cda3c684e
dangling commit 509d533a0283e7c5a434f0e8db94a5fad2cc78a8
dangling commit 76e9f0be4c47103457dd9f09c0df335e87b6be87
dangling tree c661beb9f6fbb81b6de7faf5dbd0a014042d8fca
dangling commit c899553567b147ac66defaec2af45bf2f9b29bb6
dangling blob ccd5061f26517bd381cdea73a87384ba9fea9e81
dangling commit d4314fe7cb96a17497a2f6f0be89fef777d6b99c
dangling commit d989c47ffda4e2ef8ca42e1dfae93f3a9b87500f
dangling blob d995b7da1d0a33f8dee15e589182d6bedf0b24a9
dangling blob 2662d42e3fbe3a287c6be2f339fe499bceb0d3cf
dangling tree 5b161f8f38fbe38460b06ff5a40b8cfcb0fb6869
dangling commit 9b3eddfa29c5de567b71e95d8cd2f69dd3140079
dangling commit c992b546a1b368938da4b516b118eb025b8c19ac
dangling commit 3363ed4600612bef3bf742bb94cfd58580eb8020
dangling commit 67bbc1a5b30afe9b02896b528f4613eb276405d6
dangling commit 90c758b842a4e247309b3e73bc4eb51169bd3592
dangling blob a0531b486a875499be98d2bf551b25a98923d76d
dangling commit be6ba818ab25fc913f7c4de0498f06ba2a44a967

Administrator@6XIGRIJ0JJDRMSP MINGW64 /e/guotengfei/git/VerifyServices/.git/logs (GIT_DIR!)
$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (285/285), done.
dangling blob 455067f1ef13e36817289b26e1e7f1c117618045
dangling tree 78b871161fbcef6f8f47d0fc0ed77b810ea97f95
dangling blob c058f2f0773d7a0ff7ea47221746462edc711147
dangling tree c661beb9f6fbb81b6de7faf5dbd0a014042d8fca
dangling blob ccd5061f26517bd381cdea73a87384ba9fea9e81
dangling commit d4314fe7cb96a17497a2f6f0be89fef777d6b99c
dangling blob d995b7da1d0a33f8dee15e589182d6bedf0b24a9
dangling blob 2662d42e3fbe3a287c6be2f339fe499bceb0d3cf
dangling tree 5b161f8f38fbe38460b06ff5a40b8cfcb0fb6869
dangling commit c992b546a1b368938da4b516b118eb025b8c19ac
dangling blob a0531b486a875499be98d2bf551b25a98923d76d

可以找到丢失的对象,然后恢复。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值