设为首页 收藏本站
查看: 840|回复: 0

[经验分享] Git 存储过程探究_无赖皮肤-ChinaUnix博客

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-9-18 11:52:33 | 显示全部楼层 |阅读模式
  
1一些基础概念

  1.1SHA1
  SHA1是密码学上的一种算法,git通过它来识别文件。在git中,通过对“对象”进行计算得来的SHA1,来得到对该文件项目的索引。其中SHA1值是一个40 个字符大小的“对象名”。所有对该文件的索引,都是通过该SHA值进行的。
  实例:
    ~/ChenOS$ git log commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc Author: Li Shuo  Date: Sat Sep 1 08:44:26 2012  0800 在emacs下测试一下 commit 31ea7b0e2727c11250c45c0e4783a7c9bad79b42 Author: Li Shuo  Date: Sat Sep 1 07:44:38 2012  0800 对freedos进行忽略,不提交到版本库 commit 5380879d00d6cc47b68b43387715f844362c1e09 Author: Li Shuo  Date: Fri Aug 31 20:47:37 2012  0800 add freedos.img, modified bochsrc and make it into protectmode commit c1007d90ff564de39dd4c5a53231cadf941816df Author: Li Shuo  Date: Fri Aug 31 20:03:46 2012  0800
  其中的commit后面跟着的就是SHA值。
1.2bolb对象  bolb用来存储文件的内容,它是一块二进制数据。Blob对象不像Tree或者 commit对象一样,它没有指向任何东西或者其它属性。所以说,它本质上就是一个存放文件内容的仓库。
1.3tree对象  一个tree对象通常有多个指向blob对象或者其它tree对象的指针,这个指针其实就是一个SHA值。tree对象一般用来表示内容之间的目录和层次关系。
1.4commit对象  commit对象指向一个tree对象,并且它本身带有一些相关的描述信息。
2实例测试  2.1首先查看commit对象的SHA值
  使用git last命令可以查看最近一次的提交,下面commit所跟的即是该次 commit的索引,我们可以利用该SHA值查看commit中的内容。
  该命令的语法格式:
    git last
  测试:
    ~$ cd ChenOS/ ~/ChenOS$ git last commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc Author: Li Shuo  Date: Sat Sep 1 08:44:26 2012  0800 在emacs下测试一下
2.2查看commit对象中的内容  从上一步中,我们找到了commit的SHA值,接下来可以使用该值查看commit的存储结构。
  该命令的语法格式:

  • git show -s --pretty=raw [commit-SHA]
测试:


  • ~/ChenOS$ git show -s --pretty=raw 4931e7216c
  • commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
  • tree f5b7e53e20b4fc8aea3050863c8e69962850c4a6
  • parent 31ea7b0e2727c11250c45c0e4783a7c9bad79b42
  • author Li Shuo  1346460266  0800
  • committer Li Shuo  1346460266  0800
  • 在emacs下测试一下
  从命令的输出结果上看,在commit中,存储这该commit的索引,以及tree对象,父对象,作者和提交者的信息。在这里,我们需要的只是tree对象的索引。
2.3查看tree对象中内容   由上一步,我们找到了commit指向的tree对象,我们就查看tree对象里面存着什么。
  语法格式:

  • git ls-tree [tree-SHA]
  测试:


  • ~/ChenOS$ git ls-tree f5b7e53e20b
  • 100644 blob e930018d222af541a6ec6ea93b7b09ae8af27141 .gitignore
  • 100644 blob 83019b82b43bfdcff6cc3a0fb654a8c217644cb3 README
  • 040000 tree 8034271b096fa202f664224651aade823918b4f3 V0.1
  从输出可以很清楚的看到,tree对象里面包含着blob对象以及其它tree对象的索引。仔细看,其中那个tree对象索引是一个目录,跟上面两个的属性不一样。而在这里,我们需要的是blob对象,我们希望知道blob里面放着什么。
2.4查看bolb对象中内容   语法格式:

  • git show [blob-SHA]
  测试:


  • ~/ChenOS$ git show e930018d222a
  • V0.1/freedos.img

  • *.img

  • *.bin

  • *.a

  • *.o

  • ~/ChenOS$ git show 83019b82b4
  • This is my project of ChenOs.

  • It's small , but all made by myself.
  我们再用cat看看这两个文件的内容:

  • ~/ChenOS$ cat .gitignore
  • V0.1/freedos.img

  • *.img

  • *.bin

  • *.a

  • *.o

  • ~/ChenOS$ cat README
  • This is my project of ChenOs.

  • It's small , but all made by myself.
  看清楚了吧,两者实际上是一样的,也就是说blob对象存储着文件的内容。
3总结   到现在,我们可以说基本上搞明白了git存储过程。Git通过SHA值找到commit对象,在commit对象中存储着对tree对象的索引;接着通过该tree索引,找到tree对象, tree对象中存储着对blob对象和其它tree对象的索引;最后,通过索引找到blob 对象,而blob对象中则存储着实际的文件内容。整个过程完成。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-589806-1-1.html 上篇帖子: git基础知识整理 下篇帖子: GIT/GITHUB资料导航
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表