加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

如果非得了解下 GIT 系统… – 实践篇

发布时间:2018-09-22 10:16:47 所属栏目:评测 来源:野兽
导读:副标题#e# 【新品产上线啦】51CTO播客,随时随地,碎片化学习 git的定义是一个内容寻址文件系统。内容、寻址、文件、系统,该来的总会来的 本文旨在通过实践来介绍.git文件夹中的目录及文件功能,属git基础知识。但在此基础上可解决各git使用过程中可能遇到

git gc ( garbage collect )命令将会收集所有松散对象并将它们存入 pack,合并这些 pack 进一个大的 pack,然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除,除此之外还会将所有引用 (references) 并入一个单独文件(上面有提到随着各种操作,.git下还会产生更多文件夹,.git中的packed-refs文件夹就是这时候产生的)。该命令可能通过修改配置中的 gc.auto 和 gc.autopacklimit 来调整操作阈值。注意:git gc 调用的也是 git prune ,如有需求也可关注这个命令。

至于”info文件夹是干嘛的?”这个问题还未知… 官网的描述也没看懂,也没查到或者在项目中实际出现这个文件夹有存在什么文件,要么等遇到再说?

至此git对象中的三个对象已经知道是咋回事了,还剩个tags对象,简单介绍下。

tags对象通常也是一个commit对象,指的是一个指定了开发者可读名称的一个特殊对象,如有需要也可通过 git cat-file 来解析探索。

其间关系大致如下:

  1. |- commit       aaaaa… 
  2.     |- tree       abbbb… 
  3.         |- blob       acccc… (可能是这次修改的) 
  4.         |- blob       adddd…(也可能是上次修改的) 
  5.         |- tree        aeeee…   
  6.             |- blob        affff… 
  7.   
  8. |- commit        bbbbb… 

关系图的话,这个是git官网的… 和上面的结构是一样的。

如果非得了解下 GIT 系统… – 实践篇

基于objects的介绍再回过头来看看”内容、寻址、文件、系统”便比较清晰了:以git对象作为内容,通过唯一的校验和寻址,文件形式存储的一个版本控制系统。

了解完这些,主要还是希望能够运用到实际生产中来解决问题。如 “项目中.git文件为什么这么大?怎么处理?”

可能的处理方案:

1. 执行 git gc ,如果压缩后能达到预期效果,则不做过多处理

2.针对历史记录中对某些大文件的引用,则删除对应引用的对象,操作如下

  1. git gc 
  2. git count-objects -v 
  3. git verify-pack -v .git/objects/pack/pack-(SHA-1).idx | sort -k 3 -n | tail -5 
  4. # 前面用过了git verify-pack,可知第三列信息表示的文件大小,这里用tail取前5个较大文件的记录 
  5. git rev-list --objects --all | grep (SHA-1) 
  6. # 使用 git rev-list --objects -all 来查看指定 (SHA-1) 对象信息 
  7. # ce1fed3fdbaf12e816e3028055f9feee57b33b45 xxx.mp4  比如是个视频文件 
  8. git log --pretty=oneline --branches -- xxx.mp4 
  9. # 找出哪些 commit 修改/操作了这个文件 
  10. # 94cbe08e... add xxx.mp4 
  11. git filter-branch --index-filter 'git rm --cached --ignore-unmatch xxx.mp4' -- 94cbe08e^.. 
  12. # 删除文件引用,rewrite 信息... 
  13. rm -rf .git/refs/original 
  14. rm -rf .git/logs/ 
  15. git gc 
  16. # 删除 .git/refs/original 和 .git/logs/ ,处理其中对xxx.mp4文件仍存在的引用,之后repack仓库 
  17. git count-objects -v 
  18. # 检查下操作后文件大小,或者直接在.git目录下执行 du -h -d 1 查看1级目录/文件的大小 

3.若还是难处理,或者不好处理,或者不想删除大文件的引用,则备份一份.git,然后初始化git仓库,操作如下

  1. # 除去备份操作,备份操作使用者自定义 
  2. rm -rf .git 
  3. git init 
  4. git remote add origin xxx.git  
  5.  
  6. # 重新指向新的远程仓库地址,也可根据上文所说修改config文件来指定 

参考

关于git hooks,参考Customizing-Git-Git-Hooks

https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

关于更详细的.git文件夹,参考 Gitrepository-layout-objectsinfo

https://git-scm.com/docs/gitrepository-layout#gitrepository-layout-objectsinfo

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读