git 仓库中删除历史大文件

在git中增加了一个很大的文件,而且被保存在历史提交记录中,每次拉取代码都很大,速度很慢。而且用删除
提交历史记录的方式不是很实际。
以下分几个步骤介绍如何减小.git文件夹

如果已经知道大文件的文件名,可以直接跳到第3步

1.显示10个最大的文件id列表

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

$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10
f830d5449f307e45915c2544dfef902cfbfab5d9 blob   3714990 2811488 60010494
986d0c3904de8a3b08c17b5feb9f29da442ebfd4 blob   5912773 5542283 31754
c1fd4cf06c9836d1bbd0344729af99a9e5e5f32c blob   7959920 7872976 234245152
90d45f4b62ce20fb4ff733e83267152951edad97 blob   28553670 28557775 205684107
a2f423946a59e4a2c83955f4af4d19dc1f048e5f blob   45041599 43163608 74595714
4949ea380952b32c412943ed77fb36fd5be35e84 blob   45337600 7431701 62822673
4564140f9e8ee9fefb65db2ae33a8b8a90dc29d3 blob   54272873 54107977 242200239
09401d185a5cdafadc33105b1d62b868328c0dba blob   54639114 54423305 5574037
6562f64e52e205bce49f9611e04e82a0e0f956db blob   129540654 82626130 122357710
3b08a747589895bdc995cd18ae1fe9e70abcd417 blob   697131332 691555610 296308295

2. 根据文件id查询文件路径

git rev-list --objects --all | grep 3b08a747589895bdc995cd18ae1fe9e70abcd417

$ git rev-list --objects --all | grep 3b08a747589895bdc995cd18ae1fe9e70abcd4173b08a747589895bdc995cd18ae1fe9e70abcd417 yunos_compile/aarch64-linux-gnueabi-4.9-glibc-2.20.tgz

3. 移除文件

git log --pretty=oneline --branches -- your_file
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'path/filename'" --prune-empty --tag-name-filter cat -- --all

这里的path是文件相对.git文件夹的路径,不需要写工程的完整路径。windows和linux都使用"/"分隔符

 如果你看到类似下面这样的, 就说明删除成功了:

Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
# Ref 'refs/heads/master' was rewritten

如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确.

注意: 补充一点, 如果你想以后也不会再上传这个文件或文件夹, 请把这个文件或文件夹添加到.gitignore文件里, 然后再push你的repo.

4.以强制覆盖的方式推送你的repo, 命令如下:

$ git push origin master --force --all

这个过程其实是重新上传我们的repo, 比较耗时, 虽然跟删掉重新建一个repo有些类似, 但是好处是保留了原有的更新记录, 所以还是有些不同的. 如果你实在不在意这些更新记录, 也可以删掉重建, 两者也差不太多, 也许后者还更直观些.

执行结果类似下面:

Counting objects: 4669, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4352/4352), done.
Writing objects: 100% (4666/4666), 35.16 MiB | 51 KiB/s, done.
Total 4666 (delta 1361), reused 0 (delta 0)
To https://github.com/defunkt/github-gem.git
 + beb839d...81f21f3 master -> master (forced update)

5.清理和回收空间

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.

命令如下:

$ git reflog expire --expire=now --all

$ git gc --prune=now

Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (1378/1378), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1461), reused 1802 (delta 1048)

$ git gc --aggressive --prune=now

Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (2426/2426), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1483), reused 0 (delta 0)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值