项目里把数据库和mapping.txt等文件都push到仓库里了,导致仓库变的很大,都800多M了,gitee提示如果超1G就限制push次数了。

仓库瘦身一般有两种方式,一种是使用git官方的git filter-branch命令,一种是使用三方库BFG,使用BFG简单一点,而且会快很多,这里说下步骤

主要是参考 使用BFG清除git仓库中的隐私文件或大文件

1. 下载jar包

到官网下载:官网,为了方便,将bfg-1.13.0.jar重命名为bfg.jar

2. clone自己的项目,使用–mirror参数
$ git clone -mirror git@github.com:cnting/algo.git
3. 清除大文件
//删除文件
$ java -jar bfg.jar --delete-files mapping.txt algo.git
//删除文件夹
$ java -jar bfg.jar --delete-folders 文件夹名 algo.git
//删除超过9M的文件
$ java -jar bfg.jar --strip-blobs-bigger-than 9M algo.git 

这里有个问题,bfg默认会保护当前版本(HEAD所指的版本)不去清理。如果当前版本也有要清理的文件,则需要加--no-blob-protection参数,如下

//删除文件
$ java -jar bfg.jar --delete-files mapping.txt algo.git --no-blob-protection
//删除文件夹
$ java -jar bfg.jar --delete-folders 文件夹名 algo.git --no-blob-protection
//删除超过9M的文件
$ java -jar bfg.jar --strip-blobs-bigger-than 9M algo.git --no-blob-protection
4. 清理

在完成上面的指令后,实际上这些数据/文件并没有被直接删除,这时候需要使用git gc指令来清除。

$ cd algo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
5. 推送

最后,更新完本地仓库后,将数据推送到GitHub远程仓库。按照官网描述,由于之前使用了–mirror参数,推送时会推送所有内容。

$ git push
6. 坑

当push完成后,发现仓库变的更大了,惊呆了,这时候要去gitee后台点下git gc按钮,看这里
在这里也有说:gitee
坑

7. 大文件该咋存?

参考这篇文章:Git LFS 操作指南,使用git lfs管理大文件

(1) 原理

git lfs

(2) 下载lfs
$ brew install git-lfs
$ git lfs install
(3) git lfs配置

使用如下命令追踪需要使用git lfs管理的文件,会生成一个.gitattributes文件

$ git lfs track "*.s3db"
$ git lfs track "*.jar"
$ git lfs track "*.so"
$ git lfs track "*.aar"

查看被git lfs管理的文件:

$ git lfs status

要注意的是,这个改造过程只会把当前这次 commit 的指定类型文件改成用 LFS 才存储,而不会影响所有历史记录。对于我们的 SDK 仓库,仓库本身已经非常庞大,直接这么改造是没有任何瘦身效果的。所以最好的做法就是重新创建一个仓库,把各个分支最新的快照同步过来。

(4) 添加.gitattributes文件
$ git add .gitattributes
(5) 像往常一样暂存和提交文件
$ git add .
$ git commit -m "ssssss"
$ git push
(6)下载被git lfs管理的文件
$ git lfs fetch
$ git lfs checkout
# 或
$ git lfs pull
(7)删除lfs里的文件

如果需要删除lfs里的文件,需要在gitee后台操作,先到后台里查看文件的oid
删除lfs
然后在本地通过下面命令判断是否是能删除的文件,然后在后台操作删除

$ git log --all -p -S 8a9c160e
(8)删除文件后本地分支上传时可能的报错

报错内容:

Unable to find source for object a0ee616e6195bcb5f4136fb36b6b803566cec234f4468bda64e42a34a5f76697 (try running git lfs fetch --all)
Uploading LFS objects:   0% (0/20), 0 B | 0 B/s, done.

查了下这个文件是前面我删除的文件,我想要的结果是忽略这个文件接着上传,可以设置下面这个属性

$ git config lfs.allowincompletepush true

来源在这里

8. 总结
  1. 大文件不能传git上,用git lfs管理
  2. 别一股脑的git add .
  3. 合并分支用git rebase,不要用merge
  4. 为什么仓库会越来越大
    git仓库变大原因
9. 参考:
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐