git pack压缩与垃圾对象

一、

  • 首先初始化一个空的 git 版本库,并且新增一个文件 test.txt,然后进行两个修改并使用 git add 命令添加进暂存区。
zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test
$ git init
Initialized empty Git repository in D:/myCode/linux_win_shared/git_test/.git/

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ echo abc > test.txt

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ ls
test.txt

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ git add test.txt
warning: in the working copy of 'test.txt', LF will be replaced by CRLF the next time Git touches it

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ find .git/objects/   # 当前只有一个 blob obj 对象,对应我们的 git add 命令
.git/objects/
.git/objects/8b
.git/objects/8b/aef1b4abc478178b004d62031cf7fe6db6f903
.git/objects/info
.git/objects/pack

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ vim test.txt

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ git add test.txt  # 第二次 git add 则增加 blob 对象
warning: in the working copy of 'test.txt', LF will be replaced by CRLF the next time Git touches it

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ vim test.txt

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ git add test.txt # 第三次 git add 则增加 blob 对象
warning: in the working copy of 'test.txt', LF will be replaced by CRLF the next time Git touches it
  • 进行了三个 git add 命令,总共有三个 blob 对象。
zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ find .git/objects/  # 总共三个 blob 对象
.git/objects/
.git/objects/29
.git/objects/29/8f44a95aa2209cba63b287183dfc214e8da626
.git/objects/8b
.git/objects/8b/aef1b4abc478178b004d62031cf7fe6db6f903
.git/objects/e7
.git/objects/e7/06e08ebbc4c1078782b25b5790d85c00a2b5e7
.git/objects/info
.git/objects/pack
  • 进行一次提交,情况如下:

在这里插入图片描述

  • 其中对应 test.txt 有效的其实只有一个 blob 对象,中途的两次 blob 对象是垃圾对象,是我们不需要的。
  • 可以使用 git gc 命令进行压缩,打包我们的 git 版本库对象。
  • git-gc - 清理不必要的文件并优化本地存储库

在这里插入图片描述

  • 使用命令 git verify-pack -v 命令,可以校验并查看我们压缩的 git 对象信息。
    如下,我们的pack和 idx 文件存储了有效的三个对象: commit / blob/ tree。

在这里插入图片描述

  • git-prune - 从对象数据库中修剪所有无法访问的对象。
  • git-fsck - 验证数据库中对象的连通性和有效性。
zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ git prune -n # 查看当前 git 版本库中哪些对象将被修剪掉
298f44a95aa2209cba63b287183dfc214e8da626 blob
8baef1b4abc478178b004d62031cf7fe6db6f903 blob

zzzz@Minami MINGW32 /d/myCode/linux_win_shared/git_test (master)
$ git fsck # 查看当前 git 版本库中哪些对象是悬空对象,即检测到两个无效的 git 对象
Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 298f44a95aa2209cba63b287183dfc214e8da626
dangling blob 8baef1b4abc478178b004d62031cf7fe6db6f903
Verifying commits in commit graph: 100% (1/1), done.
  • 使用命令 git prune进行对象修剪,清除垃圾对象。

在这里插入图片描述

  • 切换新分支,并创建文件,执行一次 commit。

在这里插入图片描述

  • 查看 git 版本库内容。

在这里插入图片描述

  • 下面我们将舍弃 tmp 分支及其相关内容。

在这里插入图片描述

  • 使用 git gc命令优化本地存储库

在这里插入图片描述

  • tmp 分支的 git 对象存在 pack 压缩包中。

在这里插入图片描述

  • 使用下面的命令和参数,能够真正清除掉垃圾对象。
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunr

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值