git pack压缩与垃圾对象

  • Post author:
  • Post category:其他




一、

  • 首先初始化一个空的 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

在这里插入图片描述



版权声明:本文为weixin_42109053原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。