在git中,pack文件可以有效的使用磁盘缓存,并且为常用命令读取最近引用的对象提供访问模式;git会将多个指定的对象打包成一个成为包文件(packfile)的二进制文件,用于节省空间和提高效率。
本文操作环境:Windows10系统、Git2.30.0版、Dell G3电脑。
Git的pack文件经过精心构造,可以有效地使用磁盘缓存,并为常用命令和读取最近引用的对象提供“不错”的访问模式。
Git的包文件格式相当灵活(见文档/技术/包,format.txt,或将打包文件在Git的社区图书)。
打包文件以两种主要方式存储对象:“未删除”(获取原始对象数据并进行压缩压缩)或“删除”(针对某个其他对象形成增量,然后对生成的增量数据进行压缩压缩)。
数据包中存储的对象可以按任何顺序排列(不必(不必)按对象类型,对象名称或任何其他属性排序),并且可以针对相同类型的其他任何合适的对象制作已删除的对象。
Git的pack-objects命令使用了几种启发式方法,可以为常见命令提供出色的参考位置。
这些启发式方法既控制了已删除对象的基础对象的选择,又控制了对象的顺序。
每种机制大部分都是独立的,但是它们有一些共同的目标。
Git确实形成了增量压缩对象的长链,但是试探法试图确保只有“旧”对象在长链的末端。
core.deltaBaseCacheLimit自动使用增量基本缓存(其大小由配置变量控制 ),并且可以大大减少需要读取大量对象(例如git log-p)的命令所需的“重建”次数。
增量压缩启发式典型的Git存储库存储大量对象,因此无法合理地比较所有对象以找到将产生最小增量表示形式的对(和链)。增量基数选择启发式算法是基于这样的思想,即可以在文件名和大小相似的对象中找到良好的增量基数。
每种类型的对象都是单独处理的(即,一种类型的对象永远不会用作另一种类型的对象的增量基础)。
出于增量基数选择的目的,对象(主要)按文件名和大小排序。进入此排序列表的窗口用于限制被视为潜在增量基础的对象数量。
扩展知识:
.git/objects/pack 文件过大
可能是由于开发过程中上传过大文件,虽然现已删除,但仍然保存着git记录中。
解决办法:
一、删除仓库上的项目,重新提交代码。
二、彻底清除历史记录
1.识别出最大的三个文件
git verify-pack -v .git/objects/pack/pack-8eaeb...9e.idx | sort -k 3 -n | tail -3 296169a146c50dbc100a5d0ee5be87a45cd7cbb3 blob 50296832 49474116 291684796 aae2c1bf6109f2729502349722b4c3402626d755 blob 77762481 77330392 78759794 35047899fd3b0dd637b0da2086e7a70fe27b1ccb blob 100534272 100014418 191670176
2.查询大文件的文件名
git rev-list --objects --all | grep 35047899fd3b0dd637b0da2086e7a70fe27b1ccb 35047899fd3b0dd637b0da2086e7a70fe27b1ccb /wabapi/bulid/master-0.0.1.jar
3.将该文件从历史记录的所有 tree 中移除
git filter-branch --index-filter 'git rm --cached --ignore-unmatch /wabapi/bulid/master-0.0.1.jar'
4.执行如下语句
rm -rf .git/refs/original/ git reflog expire --expire=now --all git fsck --full --unreachable git repack -A -d git gc --aggressive --prune=now git push --force
推荐学习:《Git教程》
以上是git的pack文件有什么用的详细内容。更多信息请关注PHP中文网其他相关文章!