一、
-
首先初始化一个空的 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 版权协议,转载请附上原文出处链接和本声明。