如何使用git submodule和git filter-repo从仓库中分离特定目录

碰到了一个这样的场景:同事为了单元测试,将众多测试资源文件提交到了git仓库内,这导致仓库体积陡然膨胀。但另一方面,编写好的测试用例又确实依赖这些测试资源文件。那么,有没有办法能达到以下目标: 分离工程文件和测试资源,以便能够单独管理二者 清洗提交记录,将测试资源在提交历史中“抹去”,以便减小仓库的体积 搜索一番,发现了git submodule和git filter-repo两个工具刚好可以满足这两个需求。 1 git submodule的使用 submodule是git自带的一个工具,详细的介绍参见Git-工具-子模块,这里不再赘述,只简单说明如何利用git submodule满足上述需求。 1.1 从仓库中移除测试资源 假设工程结构如下: ├─MyLib │ ├─include │ └─src ├─MyLibTest ├─assets └─src 其中MyLib为库的工程,而MyLibTest则是MyLib的单元测试工程,测试资源存放在MyLibTest/assets下,也正是我们需要移除的目录。 首先,在git bash中执行 git rm -r --cached MyLibTest/assets 将MyLibTest/assets从git仓库索引中移除,但不实际删除该目录。 关于git rm的使用,参见git-rm 1.2 新建测试资源仓库 新建远程仓库 在git服务器上新建一个仓库,记作MyLibTestResource,用于存放测试资源。 新建本地仓库 新建一个目录,这里记作TestResource,在其中建立git仓库,将MyLibTest/assets中的内容复制到该目录下,随后提交。再执行 git remote add origin git@MyLibTestResource.git #git@MyLibTestResource.git替换为MyLibTestResource的真实git地址 添加远程仓库,随后执行git push推送即可。 1.3 添加子模块 回到MyLib下,执行 git submodule add git@MyLibTestResource.git MyLibTest/assets 添加子模块MyLibTestResource,子模块的内容会同步到MyLibTest/assets下。 1.4 克隆包含子模块的项目 克隆包含子模块的项目有二种方法:一种是先克隆父项目,再更新子模块;另一种是直接递归克隆整个项目。 克隆父项目,再更新子模块 #克隆父项目MyLib git clone git@MyLib.git #git@MyLib.git替换为MyLib的真实git地址 #初始化子模块 cd MyLib git submodule init #更新子模块 git submodule update 递归克隆整个项目 git clone git@MyLib....

2020-07-23 · Qiao