美文网首页自鉴
为什么.git/objects/pack文件夹变得非常大,处理g

为什么.git/objects/pack文件夹变得非常大,处理g

作者: Billlin | 来源:发表于2020-01-23 10:49 被阅读0次

    首先来看下.git目录:

    ├── HEAD
    ├── branches
    ├── index
    ├── logs
    │   ├── HEAD
    │   └── refs
    │       └── heads
    │           └── master
    ├── objects
    │   ├── 88
    │   │   └── 23efd7fa394844ef4af3c649823fa4aedefec5
    │   ├── 91
    │   │   └── 0fc16f5cc5a91e6712c33aed4aad2cfffccb73
    │   ├── 9f
    │   │   └── 4d96d5b00d98959ea9960f069585ce42b1349a
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        │   └── master
        └── tags
    
    • \color{#ff0000}{description} 用于GitWeb程序
    • \color{#ff0000}{config} 配置特定于该仓库的设置
    • \color{#ff0000}{hooks} 放置客户端或服务端的hook脚本
    • \color{#ff0000}{HEAD} 指明当前处于哪个分支
    • \color{#ff0000}{objects} Git对象存储目录
    • \color{#ff0000}{refs} Git引用存储目录
    • \color{#ff0000}{branches} 放置分支引用的目录

    每次 \color{#ff0000}{git} \color{#ff0000}{add} 都会生成一个Git对象,称为blob 对象,存放在objects目录下。

    这个blob 对象里保存的是什么呢?

    Git在add文件时,会把文件完整的保存成一个新的blob 对象。通过 \color{#ff0000}{git} \color{#ff0000}{gc} 打包或者每次\color{#ff0000}{git} \color{#ff0000}{push} 的时候Git都会自动执行一次打包过程,将Blob对象合并成一个包文件,同时会生成一个索引文件,索引文件中包含了每个Blob对象在包文件中的偏移信息,Git在打包的过程中使用了增量编码方案,只保存Blob对象的不同版本之间的差异,这使得仓库会瘦身。

    既然Git会对Blob对象进行合并优化,那么objects文件夹为什么还会那么大呢?

    因为当Blob对象在合并时不能对.a进行差异化比较,所以每次在添加.a文件时,都会保存一份.a文件,用于后续代码还原时使用。

    所以当频繁更换.a文件时,objects下的pack文件会越来越大。虽然这个.a文件后续可能用不到删除了,但是pack中的这个.a文件的缓存还是会一直存在。

    删除pack中无用的大文件缓存

    首先先找出git中最大的文件:

    git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

    执行结果:


    第一行的字母其实相当于文件的id,用以下命令可以找出id对应的文件名:

    git rev-list --objects --all | grep 8f10eff91bb6aa2de1f5d096ee2e1687b0eab007

    找到最大的几个文件后,怎么删除呢?

    能够胜任这个任务的命令叫做 filter-branch:

    git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch XXX.framework' --tag-name-filter cat -- --all

    等命令执行完后,要提交到远程:

    git push --force --all

    参考

    Git命令的背后
    Git中文开发手册
    为什么你的 Git 仓库变得如此臃肿
    彻底删除git中没用的大文件

    相关文章

      网友评论

        本文标题:为什么.git/objects/pack文件夹变得非常大,处理g

        本文链接:https://www.haomeiwen.com/subject/xtqpzctx.html