孤零零的花朵不必羡慕丛生的刺荆
目录
对症下药
适用场景:
- 代码仓库对上传文件大小有限制时——Git LFS
- 随着提交的文件越来越多,项目越来越大,Git的响应速度越来越慢时——清理代码工程
一、自报家门
Git LFS(Git Large File Storage),即Git大文件存储技术。
在Git仓库中,对于非文本文件,如各种多媒体文件,软件制品文件,二进制文件等等,这些文件往往体积比较大,使用Git直接管理会导致仓库的体积迅速膨胀,进而导致Git的许多操作变慢,同时也影响仓库上传到远程端。
Git LFS相当于Git的一种插件式增强工具,简单讲,它是在Git仓库使用这些文件的 指针代替 实际文件,而把实际文件存储在远程端LFS服务器,同时在本地仓库中实时追踪这些文件的变动。即:
The core Git LFS idea is that instead of writing large blobs to a Git repository, only a pointer file is written.
下载&安装:
最新Git LFS下载地址
Git 版本要求 : Git >=1.8.5
Windows 安装git后,自动集成Git LFS 。如果想使用最新版,也可以到上述地址下载最新版。
下载完成后,各系统平台安装过程有所不同:
Windows / Cygwin
根据安装向导安装下载的 .exe 包后,启动一个新的命令行窗口(以使包含 git-lfs 命令的目录能被加载进 PATH,并执行以下命令:
git lfs install
macOS / Arch Linux / Debian / Ubuntu
执行以下命令即可:
git lfs install
其他系统或手动下载安装
下载完压缩包后,打开命令行进入下载文件所处的目录,并执行以下命令:
tar xf git-lfs-*.tar.gz
cd git-lfs-*
sudo ./install.sh
git lfs install
二、小试牛刀
不啰嗦直接上示例
1.新的大文件添加到代码工程
1. 选择要用LFS追踪的文件
git lfs track "*.zip"# 或者具体到某个文件git lfs track "PA.png"
这个命令会更改仓库中的 .gitattributes配置文件(如果之前不存在这个文件,则会自动新建):
查看如下:
cat .gitattributes
*.zip filter=lfs diff=lfs merge=lfs -text
PA.png filter=lfs diff=lfs merge=lfs -text2. 将文件的修改添加到暂存区,正常commit、push
# add .gitattributes配置文件 和 具体文件gitadd.git commit -m"add bigFile to LFS"# 可以通过 ls-files 命令 查看到底追踪了哪些文件git lfs ls-files
9a3c7dae41 * 1.png
d61cf5835a * 2.png
158213f90f * 3.svg
git push
常用Git LFS 命令
# 查看当前使用 Git LFS 管理的匹配列表git lfs track
# 使用 Git LFS 管理指定的文件git lfs track "*.psd"# 不再使用 Git LFS 管理指定的文件git lfs untrack "*.psd"# 类似 `git status`,查看当前 Git LFS 对象的状态git lfs status
# 枚举目前所有被 Git LFS 管理的具体文件git lfs ls-files
# 检查当前所用 Git LFS 的版本git lfs version
2.历史文件迁移到Git LFS
对于已将提交到远程仓库的文件,怎么使用LFS追踪呢?此时就需要使用git lfs migrate迁移命令了。
下面的操作涉及提交记录变更,执行之前,提前备份代码仓
git clone --mirror https://github.com/user/repo.git
示例如下:
# 重写 master 分支,将历史提交中的 PA.zip 都用 git lfs 进行管理git lfs migrate import --include-ref=master --include="PA.zip"# 重写所有分支及标签,将历史提交中的 *.rar,*.zip 都用 git lfs 进行管理。先把所有远程分支checkout到本地git checkout 分支名
git lfs migrate import--everything--include="*.rar,*.zip"# 由于历史提交改变了,所有git push 会失败,需要强制推送git push origin $branch--force# 所有分支和标签git push origin --all--forcegit push origin --tags--force
3.清理代码工程提交历史
代码工程clone下来发现占用了很大空间,但实际的文件并没有那么大,此时,可以尝试清理git 提交历史。这里推荐一个第三方工具 BFG Repo-Cleaner
废话不多说直接上示例:因为要清理提交历史,所以也是要提前备份仓库!!!!
# 1. clone 裸仓库 (clone完后,最好额外复制一份big_repo代码放到其他目录下,作为备份)
$ git clone --mirror ssh://[email protected]/user/big_repo.git
# 2. 运行jar包 清理超过200M提交 当然也可以自己设置清理提交的大小
$ java-jar bfg.jar --strip-blobs-bigger-than 200M big_repo.git
# 3. 进入代码工程目录 gc
$ cd big_repo.git
$ git reflog expire --expire=now --all&&git gc --prune=now --aggressive# 4. 推送到远程
$ git push
参考
以上就是最近对Git 大文件处理的一些实践,记录下来,也是刚刚接触,后续深入了解再补充。
码云–Git LFS 操作指南
zzz.buzz–Git LFS 操作指南
git-lfs
BFG Repo-Cleaner
版权归原作者 再见泰戈尔 所有, 如有侵权,请联系我们删除。