Skip to content

Git操作 仓库文件夹占用太大如何解决

bin4xin edited this page Apr 29, 2022 · 1 revision

Git文件夹如何解决占用空间过大

查看一下对应文件夹下的占用,过分臃肿。

[bin4xin.github.io]-git:(main)>du -d 1 -h
 56K	./_includes
604K	./_posts
 48K	./_primaryindex
 56K	./_layouts
 96K	./_drafts
8.0K	./_plugins
8.0K	./.github
273M	./.git
 40M	./assets
315M	.

0x00 .gitignore

TIPS:

一个Git仓库提交代码前需注意项目根目录创建.gitignore文件,顾名思义:Git忽略上传的,在上传之前一定要检查,且尽量不要提交大容量二进制文件若非必要

更多可以参考Wiki Git操作-Git全局禁止上传

.DS_Store
Gemfile.lock
*.swp
*~

# Editor directories and files

.bundle
vendor
.idea
.vscode
_site
.sass-cache
.jekyll-cache
.jekyll-metadata
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*

0x01 删除.git文件夹下相关

  • 1)查找出大文件
    • $ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
    • 当然也可以适当加大范围tail -5 -> tail -500,方便排查哪些文件是历史已经上传上去而当下已经不需要的;
    • 假设删除e0e1dc539347746ae0481378660fc8f69be82b06 backup/归档.zip
  • 2)删除
    • $ git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch backup/归档.zip' --tag-name-filter cat -- --all
    • 或者确认文件夹已经不使用的情况下可以直接删除文件夹
      • backup/归档.zip -> backup
  • 3)重复上述的2)命令几次,大致确定1)查找出的文件都是不需要的情况下,往下执行;

此次删除的基本都是陈图和备份:

>history|grep "git filter-branch"

9007  git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch chrome-linux.zip'
9963  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch static' --tag-name-filter cat -- --all
9972  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/blog/2016/' --tag-name-filter cat -- --all
9973  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/events/' --tag-name-filter cat -- --all
9974  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch _site/' --tag-name-filter cat -- --all
9976  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/blog/2018/' --tag-name-filter cat -- --all
9977  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/blog/2017/' --tag-name-filter cat -- --all
9978  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/slides/' --tag-name-filter cat -- --all
9979  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/project/' --tag-name-filter cat -- --all
9980  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/service/' --tag-name-filter cat -- --all
9987  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch backup' --tag-name-filter cat -- --all
9988  git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/img/blog/2015/' --tag-name-filter cat -- --all
  • 4)强制推送仓库
    • $ git push --force --all
  • 5)等待4)完成后,服务端的仓库基本就完成了所操作的占用减少,我们所感知的就是克隆的时候仓库体积会相对来说小一些;
  • 6)本地仓库减少占用,执行如下:
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now`

操作后从315M 减少-> 87M

[bin4xin.github.io]-git:(main)>du -d 1 -h
 56K	./_includes
604K	./_posts
 48K	./_primaryindex
 56K	./_layouts
 96K	./_drafts
8.0K	./_plugins
8.0K	./.github
 46M	./.git
 40M	./assets
 87M	.

以上。