Open itgoyo opened 7 months ago
笔记来源:https://www.darlang.com/2021/10/jiyicishanchugitjiluzhongdedawenjiandeguocheng/
使用以下命令可以查看占用空间最多的五个文件:
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" rev-list 命令用来列出 Git 仓库中的提交,我们用它来列出所有提交中涉及的文件名及其 ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交。
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" rev-list
--objects:列出该提交涉及的所有文件 ID。
--all:所有分支的提交,相当于指定了位于 /refs 下的所有引用。
verify-pack 命令用于显示已打包的内容。
查询结果示例:
100644 blob 266fa1f45993b2ff569d237c15603b78bb5b4516 97895533 "release/2.2.9/app-Vmeng-release_2.2.9.rar" 100644 blob b3ebda491802e3feadf005bdff51edabf4d544b0 43542403 release/2.3.0/app-vm_2.3.0.zip 100644 blob 1ebe17f16596223a88e28cb1c4a531a48b1f94ba 45720176 release/2.2.9/app-Vmeng-release_2.2.9.apk 100644 blob 09ec712df308727d08ba55489cb678ab97628fcc 44637304 release/2.3.0/app-vm_2.3.0.apk 100644 blob 79aaf28894e878007e814a5c38309cef64f37904 44614399 release/2.2.8/app-Vmeng-release_2.2.8.apk
使用以下命令,删除历史提交过的大文件:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.jar' --prune-empty --tag-name-filter cat -- --all 上面脚本中的 big-file.jar 请换成你第一步查出的大文件名,需要带齐目录,或者这里直接写一个目录。
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.jar' --prune-empty --tag-name-filter cat -- --all
filter-branch 命令可以用来重写 Git 仓库中的提交
--index-filter 参数用来指定一条 Bash 命令,然后 Git 会检出(checkout)所有的提交, 执行该命令,然后重新提交。
–all 参数表示我们需要重写所有分支(或引用)。
示例:
删除某文件【❗️❗️❗️一定要带路径】
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch release/2.2.9/app-Vmeng-release_2.2.9.rar' --prune-empty --tag-name-filter cat -- --all 删除某目录
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch release/2.2.9/app-Vmeng-release_2.2.9.rar' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch release/2.3.0/' --prune-empty --tag-name-filter cat -- --all 在重写提交的过程中,会有以下日志输出:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch release/2.3.0/' --prune-empty --tag-name-filter cat -- --all
Rewrite 6cdbb293d453ced07e6a07e0aa6e580e6a5538f4 (266/266) # Ref 'refs/heads/master' was rewritten
如果显示 xxxxx unchanged, 说明 repo 里没有找到该文件,请检查路径和文件名是否正确,重复上面的脚本,把所有你想删除的文件都删掉。
以强制覆盖的方式推送你的 repo, 命令如下:
git push origin master --force 涉及多个分支,需要一一对应的提交一次
git push origin master --force
step 4. 清理和回收空间 虽然上面我们已经删除了文件,但是我们的 repo 里面仍然保留了这些 objects, 等待垃圾回收 (GC), 所以我们要用命令彻底清除它,并收回空间,命令如下:
rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now
笔记来源:https://www.darlang.com/2021/10/jiyicishanchugitjiluzhongdedawenjiandeguocheng/
Step 1 查看哪些历史提交过文件占用空间较大
使用以下命令可以查看占用空间最多的五个文件:
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" rev-list
命令用来列出 Git 仓库中的提交,我们用它来列出所有提交中涉及的文件名及其 ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交。--objects:列出该提交涉及的所有文件 ID。
--all:所有分支的提交,相当于指定了位于 /refs 下的所有引用。
verify-pack 命令用于显示已打包的内容。
查询结果示例:
step 2. 重写 commit,删除大文件
使用以下命令,删除历史提交过的大文件:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.jar' --prune-empty --tag-name-filter cat -- --all
上面脚本中的 big-file.jar 请换成你第一步查出的大文件名,需要带齐目录,或者这里直接写一个目录。filter-branch 命令可以用来重写 Git 仓库中的提交
--index-filter 参数用来指定一条 Bash 命令,然后 Git 会检出(checkout)所有的提交, 执行该命令,然后重新提交。
–all 参数表示我们需要重写所有分支(或引用)。
示例:
删除某文件【❗️❗️❗️一定要带路径】
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch release/2.2.9/app-Vmeng-release_2.2.9.rar' --prune-empty --tag-name-filter cat -- --all
删除某目录git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch release/2.3.0/' --prune-empty --tag-name-filter cat -- --all
在重写提交的过程中,会有以下日志输出:如果显示 xxxxx unchanged, 说明 repo 里没有找到该文件,请检查路径和文件名是否正确,重复上面的脚本,把所有你想删除的文件都删掉。
step 3. 推送修改后的 repo
以强制覆盖的方式推送你的 repo, 命令如下:
git push origin master --force
涉及多个分支,需要一一对应的提交一次step 4. 清理和回收空间 虽然上面我们已经删除了文件,但是我们的 repo 里面仍然保留了这些 objects, 等待垃圾回收 (GC), 所以我们要用命令彻底清除它,并收回空间,命令如下: