git 仓库清理 瘦身,仓库体积过大被屏蔽

1,154 阅读6分钟

WeChat75e92c401a96735a6853a9ee98e54b95.png 新接手的项目,闭着眼上传了子项目文件,然后

  • 提交报错:This repository(including wiki) size 1603.43 MB, exceeds 1024.00 MB.
  • 查看gitee提示项目文件过大,且只有三次机会强推

解决操作: BFG工具,简单迅速,直接处理镜像文件

//进入文件夹
cd AAA

//克隆镜像文件到文件夹
git clone --mirror https://gitee.com/oldAAA.git
//或git clone --mirror git@gitee.com:oldAAA.git

//删除文件
// 不知道哪些文件需要删除的,可用以下命令查找
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -20 | awk '{print$1}')"
//【--no-blob-protection】表示删除所有分支,不加的话会保留当前分支
//【driving-wizard.git】这是我的镜像文件名,需要替换
java -jar bfg.jar --delete-folders LightExam driving-wizard.git --no-blob-protection
java -jar bfg.jar --delete-folders UnityProject driving-wizard.git --no-blob-protection
java -jar bfg.jar --delete-folders Unity-iPhone driving-wizard.git --no-blob-protection
java -jar bfg.jar --delete-folders Pods driving-wizard.git --no-blob-protection
java -jar bfg.jar --delete-folders Images driving-wizard.git --no-blob-protection
//删除文件
java -jar bfg.jar --delete-files UnityFramework.framework driving-wizard.git --no-blob-protection

//进入镜像文件,清理回收空间
cd RobotArm.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive

//至此,镜像文件从1.2G 缩减到 320M

//推送到新的空仓库,查看效果
git push --mirror https://gitee.com/newAAA.git
//git push --mirror git@gitee.com:newAAA..git

// 最后拉新仓库的代码下来都运行试试,有误删的文件去原仓库或者备份代码中找

处理下gitnone文件吧,免得以后再把不必要的东西传上去

  • 所有分支都检查下,我特么又踩坑了
vim .gitignore
i键 进入编辑模式
//添加配置

build/
DerivedData/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
*.xcuserstate
*.moved-aside
*.xccheckout
*.xcscmblueprint
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
.DS_Store
.zip
Carthage/Build
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
iOSInjectionProject/
.git/
# CocoaPods
Pods
!Podfile
Podfile.lock
# 个人文件
UnityFramework.framework
UnityProject/
Unity-iPhone/
LightExam/

esc键 然后输入 :wq  推出编辑

//然后
git rm -r --cached .
git add .
git commit -m "update .gitignore"
git push origin master



下面的看看就行了,我用下面的方法,只成功了一半,本地缩减的很小,强推成功,GC操作之后,远端仓库没啥变化

1.直接新建个项目

  • 新建项目最简单了,但我想保留分支和历史记录,那就迁移到一个新的仓库随便搞

  • 这样就会保留原来的仓库作为备份,还有一份本地备份,万无一失

  • 迁移整个项目:
  • 拿到旧仓库的地址【gitee.com/oldAAA.git】

  • git 新建空仓库 新地址【gitee.com/newAAA.git】

cd AAA
git clone --bare https://gitee.com/oldAAA.git
// 或者git clone --bare git@gitee.com:oldAAA.git
cd project_name.git
git push --mirror https://gitee.com/newAAA.git
//git push --mirror git@gitee.com:newAAA..git
  • 新建空文件夹 AAA 依次执行上述命令,即可实现将git仓库从 oldAAA 迁移 到 newAAA.git 且保留提交记录,分支等信息。
//git push 上传结果
Enumerating objects: 31349, done.
Counting objects: 100% (31349/31349), done.
Delta compression using up to 8 threads
Compressing objects: 100% (14566/14566), done.
Writing objects: 100% (31349/31349), 1.41 GiB | 795.00 KiB/s, done.
Total 31349 (delta 16225), reused 31349 (delta 16225), pack-reused 0
remote: Resolving deltas: 100% (16225/16225), done.
remote: Powered by GITEE.COM [GNK-6.4]
remote: This repository(including wiki) size 1453.08 MB, exceeds 1024.00 MB.
remote: You only have 3 push opportunities
remote: HelpLink:       https://gitee.com/help/articles/4232
remote: Repository GC:  https://gitee.com/dddaz/driving-wizard-new/settings#git-gcRecommended to reduce the repository size
remote: Warning: this repository(including wiki) size 1453.08 MB exceeds 500.00 MB
remote: HelpLink: https://gitee.com/help/articles/4232

远程:由GITEE.COM [GNK-6.4]提供支持
remote:这个存储库(包括wiki)大小为1453.08 MB,超过1024.00 MB。
remote:你只有3个推送机会
remote: helpink: https://gitee.com/help/articles/4232
remote:存储库GC: https://gitee.com/dddaz/driving-wizard-new/settings#git-gcRecommended以减少存储库大小
警告:此存储库(包括wiki)大小1453.08 MB超过500.00 MB
  • 然后clone新仓库,执行后面的操作

2.使用下面两种方法,清理强推

  • 【1】.使用git-repo-clean工具(推荐!自动化操作,中文提示)

  • gitee.com/oschina/git…

  • git repo-clean -i

  • 然后按照提示操作就行了

  • WeChat945b864f5360f31620c7dee796f53b6a.png

  • 清理过后还是提不上去,卡在这了,应该是强推次数超过三次了,再搞个仓库试试

  • a2e2cca963c29aa613309d8f54bb1ca0.png

复制会导致前面的操作失效,整个项目又变成2G了

  • 【2】.命令删除文件强推

  • cd到项目路径

  • 查找 提交记录中大文件

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
  • 删除 提交记录中大文件
//删除的文件的相对路径(相对于git仓库的跟目录), 替换成你要删除的文件即可. 注意一点,这里的文件或文件夹,都不能以 '/' 开头,否则文件或文件夹会被认为是从 git 的安装目录开始。
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH' --prune-empty --tag-name-filter cat -- --all
//如果你要删除的目标不是文件,而是文件夹,那么请在 `git rm --cached' 命令后面添加 -r 命令,表示递归的删除(子)文件夹和文件夹下的文件,类似于 `rm -rf` 命令
git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch 文件名' --prune-empty --tag-name-filter cat -- --all
  • 清理回收空间 彻底删除
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
  • 覆盖推送
//强制覆盖的方式推送
git push origin --force --all
  • 提交遇到413报错, 尝试替换为ssl提交
Enumerating objects: 10877, done.
Counting objects: 100% (10872/10872), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4898/4898), done.
Writing objects: 100% (9886/9886), 692.90 MiB | 969.00 KiB/s, done.
Total 9886 (delta 5404), reused 8923 (delta 4668), pack-reused 0
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly
Everything up-to-date
  • 看来删除的远远不够,需要精简到1G以内
  • 但是之前未上传大文件(子工程)前,项目早就超过1G了,没搞明白
Enumerating objects: 12867, done.
Counting objects: 100% (12862/12862), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5792/5792), done.
Writing objects: 100% (11873/11873), 855.51 MiB | 813.00 KiB/s, done.
Total 11873 (delta 6437), reused 10914 (delta 5697), pack-reused 0
remote: Resolving deltas: 100% (6437/6437), completed with 345 local objects.
remote: Powered by **GITEE.COM** [**GNK-6.4**]
remote: This repository(including wiki) size **2.32 GB**, exceeds **1024.00 MB**.
remote: Push rejected for repository **size exceeds limit**.
remote: HelpLink:           **https://gitee.com/help/articles/4232**
To gitee.com:sdjkjl-app-ios/driving-wizard.git
 ! [remote rejected]   dw_dev_live_1.3 -> dw_dev_live_1.3 (pre-receive hook declined)
 ! [remote rejected]   master -> master (pre-receive hook declined)
 ! [remote rejected]   master_onLine -> master_onLine (pre-receive hook declined)
error: failed to push some refs to 'gitee.com:sdjkjl-app-ios/driving-wizard.git'
  • 删Pods等记录,然后重复上述步骤
git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch Pods' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch LightExam' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch UnityProject' --prune-empty --tag-name-filter cat -- --all

3.注意点

  • 上述步骤执行过程中,建议关闭SourceTree、GitHbDeskTop类的工具(与此无关),不要在项目文件夹复制等操作
  • 只有三次强推机会,一定要处理干净了再去推,超过三次强推也会失败!!!!
  • 强推后执行GC操作
  • 然后查看仓库大小有没有变化
  • GC 后 处理gitnone
vim .gitignore
//添加配置

//然后
git rm -r --cached .
git add .
git commit -m "update .gitignore"
git push origin master
  • 删除本地项目,重新clone