git 大文件删除及管理
项目里把数据库和mapping.txt等文件都push到仓库里了,导致仓库变的很大,都800多M了,gitee提示如果超1G就限制push次数了。仓库瘦身一般有两种方式,一种是使用git官方的git filter-branch命令,一种是使用三方库BFG,使用BFG简单一点,而且会快很多,这里说下步骤主要是参考 使用BFG清除git仓库中的隐私文件或大文件1. 下载jar包到官网下载:官网,为了方
项目里把数据库和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) 原理
(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
然后在本地通过下面命令判断是否是能删除的文件,然后在后台操作删除
$ 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. 总结
- 大文件不能传git上,用
git lfs
管理 - 别一股脑的
git add .
- 合并分支用
git rebase
,不要用merge
- 为什么仓库会越来越大
9. 参考:
更多推荐
所有评论(0)