[git] 上传大于100M的文件到github远程仓库中
一、摘要
github是全球最大的代码托管平台,我门常常需要将自己本地的代码仓库上传到github远程仓库中。对于单个文件大小小于100M的文件,在网络良好的情况下可以顺利的上传到github远程仓库中。但是某些情况下,我们需要上传大于100M大小的文件,例如程序文档、演示视频等,而github平台对文件大小进行了限制,直接使用git push origin master
或其他IDE内置的git工具push
会产生remote: error: GH001:Large files detected. You may want to try Git Large File Storage - ...
错误,如下图所示。为了成功上传大于100M的文件到github中,需要使用Git LFS工具。
本文第二部分介绍了如何使用Git LFS上传大文件
到github中的方法,包括:
- 已经知道
大文件
(为了叙述方便,本文将大于100M大小的文件称为大文件
)的存在时,如何操作将包含大文件
的本地仓库push到github; - 在push后发生
remote:error:GH001
错误时解决方法;
本文要求读者的电脑上已经安装配置好git,并且读者已经掌握git的基本操作,包括add,commit,remote add,push
等命令的使用。
二、解决方法
1. 已知大文件的存在,push大文件到github的方法
假设我们的本地代码仓库已经初始完成,并且已经设置好远程仓库地址。现在突然要在本地仓库中添加一个大文件 A.pdf
,此时的A.pdf
还为添加到暂存区中过,可以按照以下步骤将A.pdf
添加到代码仓库,并push
到github远程仓库。
(1). 下载安装Git LFS
在Git LFS官网Git Large File Storage上下载Git LFS客户端并安装。
(2). 在git仓库中启用lfs
并track大文件A.pdf
:
在本地仓库目录下输入以下命令:
# 启用 git lfs
git lfs install
运行后会显示:
Updated git hooks.
Git LFS initialized.
使用git lfs跟踪大文件A.pdf:
# 使用git lfs跟踪大文件A.pdf
git lfs track A.pdf
此时git lfs会在本地代码仓库文件目录下生成一个隐藏文件.gitattributes
,查看.gitattributes
显示内容如下:
cat .gitattributes
A.pdf filter=lfs diff=lfs merge=lfs -text
(3). 将大文件
和.gitattributes
添加到代码区,并push到远程代码仓库
# 将A.pdf和.gitattributes添加到暂存区
git add A.pdf
git add .gitattributes
# commit暂存区内容
git commit -m "Add A.pdf and .gitattributes ."
# push到远程github仓库
git push origin master
此时即可将大文件A.pdf
push到github远程仓库中。
2. push时产生remote:error:GH001错误的解决方案
还有一种情况是我们原本不知道本地文件A.pdf
大于100M,在git add A.pdf
、git commit
之后git push origin master
时显示remote:error:GH001...
错误,这时我们即使再按照 1. 中步骤操作也会显示remote:error:GH001...
错误,这是因为在之前的commit
中已经将A.pdf
添加到仓库中,隐藏文件夹.git
下已经有A.pdf
的目标文件,即使之后使用git lfs track
等操作也不会改变之前commit
的状态。
(1). 知道未提交大文件A.pdf的最后一次commit时的方法
此时我们可以使用reset
命令回到提交A.pdf
文件之前的状态,然后再按照1. 中的步骤使用git lfs添加大文件A.pdf
。(注意!!!reset
命令会使git回退到指定的版本,在指定版本之后的提交都会清空)。
步骤如下:
git reset ******(此处填未提交A.pdf时的commit状态哈希值,可以只填前6位)
# 启用 git lfs
git lfs install
# 使用git lfs跟踪大文件A.pdf
git lfs track A.pdf
# 将A.pdf和.gitattributes添加到暂存区
git add A.pdf
git add .gitattributes
# commit暂存区内容
git commit -m "Add A.pdf and .gitattributes ."
# push到远程github仓库
git push origin master
(2). 不确定未提交大文件A.pdf的最后一次commit时的方法
此时可以将A.pdf
文件删除,重写commit并清理回收空间后在使用git lfs添加A.pdf大文件。命令如下:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch A.pdf' --prune-empty --tag-name-filter cat -- --all
如果此时报错:
Cannot rewrite branches: Your index contains uncommitted changes.
使用如下命令解决:
git stash
清理和回收空间
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
三、参考
[1]. GitHub大文件(大于100M)上传
[2]. GitHub 上传文件过大报错:remote: error: GH001: Large files detected.
[3]. GitHub限制上传单个大于100M的大文件
[4]. Git清理删除历史提交文件