Git-代码工程清理

孤零零的花朵不必羡慕丛生的刺荆


对症下药

适用场景:

  1. 代码仓库对上传文件大小有限制时——Git LFS
  2. 随着提交的文件越来越多,项目越来越大,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 -text
2. 将文件的修改添加到暂存区,正常commit、push
# add .gitattributes配置文件 和 具体文件
git add . 
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 --force
git push origin --tags --force

3.清理代码工程提交历史

代码工程clone下来发现占用了很大空间,但实际的文件并没有那么大,此时,可以尝试清理git 提交历史。这里推荐一个第三方工具 BFG Repo-Cleaner

废话不多说直接上示例:因为要清理提交历史,所以也是要提前备份仓库!!!!

# 1. clone 裸仓库 (clone完后,最好额外复制一份big_repo代码放到其他目录下,作为备份)
$ git clone --mirror ssh://git@github.com/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值