验证下这个文件内容是什么,注意,这是个二进制球,呸…是文件,文明观球,呸…是观看。这里我们用传说中git中的手术刀( git cat-file )来解剖git文件。
- git cat-file -p 442406aa9341668f9c43c2d5378a777ad69324a0
- # 输出 a
9de29bb2d1d6434b8b29ae775ad8c2e48c5391 是个二进制文件,是git对象中的blob对象,它记录了当前版本的该文件的数据内容,并以SHA-1计算产生一个40个字符的校验和。 根据官方描述:这是一个 SHA-1 哈希值——一个将待存储的数据外加一个头部信息(header)一起做 SHA-1 校验运算而得的校验和。
继续操作,修改test
- vi test
- # 第二行输入 b ,保存,退出
- git add test
- find .git
- # objects 下又多了个文件夹,且里面也有文件
- # .git/objects/bf
- # .git/objects/bf/daa0f1c3415c09d3080063911d155fd7259d18
这次的二进制文件的数据内容是 a (手动换行) b 。
继续走下去:
- git commit -m “add test”
- # wtf,怎么突然生出2个文件夹,来来来,看看内容
- # .git/objects/3e
- # .git/objects/3e/5f95cd5c4f0ff429522b0fdfeda9369f92d89c
- # .git/objects/fd
- # .git/objects/fd/1332e4e95f8a64682c1516e175abb66b6f6325
- git cat-file -t fd1332e4e95f8a64682c1516e175abb66b6f6325
- # commit
- git cat-file -p fd1332e4e95f8a64682c1516e175abb66b6f6325
- # tree对象、作者、提交者、提交日期、提交信息、父对象(有的话带一个或多个父对象)
- # tree 3e5f95cd5c4f0ff429522b0fdfeda9369f92d89c
- # author yeshou <yeshou@xxx.com> 1535168447 +0800
- # committer yeshou <yeshou@xxx.com> 1535168447 +0800
- # add dir-test
- git cat-file -t 3e5f95cd5c4f0ff429522b0fdfeda9369f92d89c
- # tree
- git cat-file -p 3e5f95cd5c4f0ff429522b0fdfeda9369f92d89c
- # 100644 blob bfdaa0f1c3415c09d3080063911d155fd7259d18 test
- git cat-file -p bfdaa0f1c3415c09d3080063911d155fd7259d18
- # a (换行) b
3e5f95cd5c4f0ff429522b0fdfeda9369f92d89c 也是个二进制文件,是git对象中的tree对象,记录着blob标识符、路径名和在一个tree下的所有文件的元数据。
fd1332e4e95f8a64682c1516e175abb66b6f6325 又是个二进制文件,是git对象中的commit对象,它记录了当前版本的一次提交数据内容,包含tree对象、作者、提交者、提交日期、提交信息、父对象(有的话带一个或多个父对象)。
然后,pack文件夹是干嘛的?
随着objects文件夹下的文件夹和文件不断生成(也就是N多次的commit之后),objects文件夹明显会”长大”,这时开发者可以用 git gc 来对之前的操作的对象做整理压缩。
pack 文件夹内有2个文件 pack-(SHA-1).pack 和 pack-(SHA-1).idx 前者是以压缩形式存储之前记录对象的文件,后者用以存储访问索引的文件。
举个例子:
- git gc
- # Counting objects: 12, done.
- # Delta compression using up to 4 threads.
- # Compressing objects: 100% (4/4), done.
- # Writing objects: 100% (12/12), done.
- # Total 12 (delta 0), reused 0 (delta 0)
- find .git
- # 发现少了很多objects里的文件夹和文件,多了以下2个文件
- # .git/objects/pack/pack-2021ec3cb18c796fdfca8ef616fb6a20b1449ab1.pack
- # .git/objects/pack/pack-2021ec3cb18c796fdfca8ef616fb6a20b1449ab1.idx
- git verify-pack -v .git/objects/pack/pack-2021ec3cb18c796fdfca8ef616fb6a20b1449ab1.idx
- # 列出之前存在objects里的所有操作数据内容
- # 655a12c9b83a029bb46fa852ea15e6affd1587d8 commit 167 117 510
- # ...
- # 616dfdb2643c725fa1027ecef76d49d482d9e26d tree 32 43 670
- # ...
- # bfdaa0f1c3415c09d3080063911d155fd7259d18 blob 5 14 853
- # 也可以通过后面加 | grep keyword 来搜索所需的内容,如下列出所有commit记录
- git verify-pack -v .git/objects/pack/pack-2021ec3cb18c796fdfca8ef616fb6a20b1449ab1.idx | grep commit
(编辑:源码网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|