|
其间关系大致如下:
- |- commit aaaaa…
- |- tree abbbb…
- |- blob acccc… (可能是这次修改的)
- |- blob adddd…(也可能是上次修改的)
- |- tree aeeee…
- |- blob affff…
-
- |- commit bbbbb…
关系图的话,这个是git官网的… 和上面的结构是一样的。

基于objects的介绍再回过头来看看”内容、寻址、文件、系统”便比较清晰了:以git对象作为内容,通过唯一的校验和寻址,文件形式存储的一个版本控制系统。
了解完这些,主要还是希望能够运用到实际生产中来解决问题。如 “项目中.git文件为什么这么大?怎么处理?”
可能的处理方案:
1. 执行 git gc ,如果压缩后能达到预期效果,则不做过多处理
2.针对历史记录中对某些大文件的引用,则删除对应引用的对象,操作如下
- git gc
- git count-objects -v
- git verify-pack -v .git/objects/pack/pack-(SHA-1).idx | sort -k 3 -n | tail -5
- # 前面用过了git verify-pack,可知第三列信息表示的文件大小,这里用tail取前5个较大文件的记录
- git rev-list --objects --all | grep (SHA-1)
- # 使用 git rev-list --objects -all 来查看指定 (SHA-1) 对象信息
- # ce1fed3fdbaf12e816e3028055f9feee57b33b45 xxx.mp4 比如是个视频文件
- git log --pretty=oneline --branches -- xxx.mp4
- # 找出哪些 commit 修改/操作了这个文件
- # 94cbe08e... add xxx.mp4
- git filter-branch --index-filter 'git rm --cached --ignore-unmatch xxx.mp4' -- 94cbe08e^..
- # 删除文件引用,rewrite 信息...
- rm -rf .git/refs/original
- rm -rf .git/logs/
- git gc
- # 删除 .git/refs/original 和 .git/logs/ ,处理其中对xxx.mp4文件仍存在的引用,之后repack仓库
- git count-objects -v
- # 检查下操作后文件大小,或者直接在.git目录下执行 du -h -d 1 查看1级目录/文件的大小
3.若还是难处理,或者不好处理,或者不想删除大文件的引用,则备份一份.git,然后初始化git仓库,操作如下
- # 除去备份操作,备份操作使用者自定义
- rm -rf .git
- git init
- git remote add origin xxx.git
-
- # 重新指向新的远程仓库地址,也可根据上文所说修改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 (编辑:网站开发网_安阳站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|