[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工具。

remote:error:GH001
本文第二部分介绍了如何使用Git LFS上传大文件到github中的方法,包括:

  1. 已经知道大文件(为了叙述方便,本文将大于100M大小的文件称为大文件)的存在时,如何操作将包含大文件的本地仓库push到github;
  2. 在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.pdfgit 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清理删除历史提交文件

posted on 2021-10-10 15:26  刘好念  阅读(244)  评论(0编辑  收藏  举报  来源