本期推荐的是对Git仓库大文件进行扫描、清理,并重写提交历史的Git拓展工具。
介绍
git repo-clean 是一个用Golang开发的具备Git仓库大文件扫描,清理,并重写commit提交记录功能的Git拓展工具。
Git仓库数据过滤的大概流程
git 本身提供了两个命令: git-fast-export, git-fast-import, 他们分别作用将Git仓库数据(.git/objects)导出为特定格式的元数据,流式读取这种特定格式的元数据,并生成一个完成的Git仓库。任何符合这种格式的文件,输入给git-fast-import都能创建一个Git仓库。
所以git-clean-repo的大致流程如下:
fast-export
|
| output stream
|
---> parser(blob, commit, reset, tag...)
|
|
|
---> filter(blob size, blob oid)
|
| input stream
|
---> fast-import
依赖环境:
- Git >= 2.24.0 (必须)
- Golang >= 1.15 (可选)
安装
1 二进制包安装
下载链接:https://gitee.com/oschina/git-repo-clean/releases/
解压,即可进入加压后的目录,有如下文件:
-rwxrwxr-x 1 git git 6.3M Dec 1 17:31 git-repo-clean.exe # 程序包(此为Windows下的程序包,其它平台类似)
-rw-rw-r-- 1 git git 5.1K Dec 1 17:31 README.md # 使用文档(即本文档)
drwxrwxr-x 3 git git 4.0K Dec 1 17:31 docs # 附录文档
-rw-rw-r-- 1 git git 9.6K Dec 1 17:31 LICENSE # 许可证
解压后,并不是直接点击 git-repo-clean.exe 就能用,而是需要经过下面的安装步骤才能使用。
2 源码编译安装包
该方式需要你的电脑有基本的make编译环境,以及Golang环境
$ git clone https://gitee.com/oschina/git-repo-clean
# 进入源码目录,编译
$ cd git-repo-clean
$ make
# 在bin/目录下即是编译后的程序包
- Linux环境
sudo cp git-repo-clean $(git --exec-path)
- Windows环境
方法一:将可执行文件git-repo-clean.exe的路径放到系统$PATH路径中,大致操作步骤为: 点击Windows的[开始] –> 输入path –> 选择编辑系统环境变量–> 选择环境变量<N> –> 在系统变量(S)中选择Path –> 选择新建(N) –> 将刚才解压的包含git-repo-clean.exe文件的路径复制到新建的环境变量中。
方法二:也是将git-repo-clean.exe复制到 Git 的执行目录下:cp git-repo-clean.exe $(git –exec-path)。(Git可能安装在C盘某个目录中,需要特别权限才能复制)
方法三:也可以直接复制该可执行文件git-repo-clean.exe到C:\Windows\system32目录下。(不推荐使用该方法,因为可能会误操作,导致系统文件被破坏)
- Mac OS环境
与Linux上的操作类似。 但是注意:在Mac OS上进行配置之后可能无法执行,需要授权,具体方式为: System Preferences -> Security & Privacy 点击 Allow Anyway 始终允许即可:
通过方法安装完成后,执行如下命令检测是否安装成功:
git repo-clean --version
使用
- 交互式用法
输入git repo-clean可以直接进入交互模式 该方式进入交互模式,因为没有加任何参数,只能使用默认选项。此模式下默认打开的选项有–scan, –delete, –verbose,如果想使用其它选项,如–branch,则可以使用如下方式:
git repo-clean -i[--interactive]
使用-i 选项进入交互式模式,该方法可以追加其它选项,如git repo-clean -i –branch=topic
- 命令行式用法
git repo-clean --scan --limit=1G --type=tar.gz --number=1
在仓库中使用命令行,扫描仓库当前分支的文件,文件最小为1G,类型为tar.gz,显示前1个结果
git repo-clean --scan --limit=1G --type=tar.gz --number=1 --delete
加上–delete选项,则会批量删除当前分支扫描出的文件,并重写相关提交历史(包括HEAD)
如果想要清理其他分支的数据或者所有分支的数据,可以使用–branch选项,如–branch=all则可以进行全扫描,会把所有分支上筛选出的数据清理掉。
git repo-clean --scan --limit=1G --type=tar.gz --number=1 --delete --branch=all
加上–branch选项,则会扫描所有分支的文件再执行删除,并重写相关提交历史。