[Git] 处理 github 不允许上传超过 100MB 文件的问题
最近在使用 Github 时候遇到一个问题,有一些过大的文件不允许上传,例如:
remote: error: File Examples/iOSDemo/Pods/dependency/libg2o.a is 440.12 MB; this exceeds GitHub's file size limit of 100.00 MB
但有的时候我们还是需要上传这些大文件,这时候怎样做呢?
1、移除错误缓存
如果是当前提交中添加了大文件:
首先应该移除所有错误的 cache,对于文件:
1 | git rm --cached path_of_a_giant_file |
对于文件夹:
1 | git rm --cached -r path_of_a_giant_dir |
例如对于我的例子就是这样的:
1 | git rm --cached -r Examples/iOSDemo/Pods/dependency/libg2o.a |
如果是历史提交中就有大文件:
2、重新提交
编辑最后提交信息:
1 | git commit --amend |
修改 log 信息后保存返回。
重新提交:
1 | git push |
PS:如果上面的步骤仍然无法解决问题,则可以运行如下命令删除有关某个文件的push操作:
1 | git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch YOUR-FILE' |
3、将大文件加入 Git Large File Storage:
1)首先安装 git-lfs
Mac 安装:
1 | brew install git-lfs |
Ubuntu 安装:
下载 https://github.com/git-lfs/git-lfs/releases 合适的版本例如 Linux AMD64,解压后进入目录直接运行安装脚本:
1 | sudo ./install.sh |
2)将想要保存的大文件 “路径” 或者 “类型” 添加进 track:
1 | git lfs track "name_of_a_giant_file" |
例如对于我的例子就是这样的:
1 | git lfs track "libg2o.a" |
- 需要注意的是这里面仅能添加类型的扩展名或者文件名作为跟踪方式,不可以添加路径或者目录进行跟踪。
4、将想要保存的大文件正常添加进 git:
1 | git add path_of_a_giant_file |
或者:
1 | git add extension_name_of_giant_files |
例如对于我的例子就是这样的:
1 | git add Examples/iOSDemo/Pods/dependency/libg2o.a |
5、正常进行提交&推送:
1 2 | git commit -m "Add design file" git push origin master |
补充技巧:
提交以后出错再进行上面的步骤可能比较麻烦,如果你已知自己提交的版本库中确实存在一些大于 100MB 的文件,不妨先搜索:
1 | find ./ -size +100M |
然后将这些文件移除,等待其他文件提交完后再复制回来,这样只需要从步骤3的操作开始就可以了。
6、取消 lfs 文件 track
1 2 | git lfs untrack 'your-lfs-file' git rm --cached 'your-lfs-file' |
常见问题:
1、错误:fatal error: unexpected signal during runtime execution
goroutine 23 [chan receive]:
github.com/github/git-lfs/lfs.ScanRefsToChan.func2(0xc8200d4540, 0xc8200c6000, 0xc8200d45a0)
/Users/rick/go/src/github.com/github/git-lfs/lfs/scanner.go:153 +0x4e
created by github.com/github/git-lfs/lfs.ScanRefsToChan
/Users/rick/go/src/github.com/github/git-lfs/lfs/scanner.go:160 +0x30c
出现这个问题通常是由于 go 引擎未安装或者版本太老(1.5.1及以下版本在 Mac 上面有未知错误),或者 git-lfs 版本太老。如果没有安装 go,可使用如下命令安装:
1 | brew install git-lfs |
然后使用如下命令升级:
1 2 3 | brew update brew upgrade go brew upgrade git-lfs |
然后使用如下命令查看:
1 | git-lfs version |
我这里的版本号如下,如果你比我的版本高就对了,否则可以尝试卸载之前安装的 go 和 git-lfs 重新安装:
git-lfs/1.5.5 (GitHub; darwin amd64; go 1.7.4)
2、错误:fatal: refusing to merge unrelated histories
当使用 git push 后,再拉取更新可能会出现拒绝合并无关历史的情况,可以使用下面的命令解决(master 是你当前的 branch):
1 | git pull origin master --allow-unrelated-histories |
如果发现仓库中的文件大小不对,使用:
1 | git lfs install |
初始化,然后拉取:
1 | git lfs pull |
参考文献:
[1] https://help.github.com/enterprise/11.10.340/user/articles/working-with-large-files/
[2] https://git-lfs.github.com/
[3] https://gist.github.com/naviocean/4f2cd50ece9d4cce720d2127916788cb
[4] 使用 Git 存储大文件
文章写得很明晰,也解决了我的问题,感谢大佬!