当前位置: 首页 > news >正文

抛砖系列之git仓库拆分工具git-filter-repo

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来。

背景

笔者团队目前是把业务相关的java项目都放到了一个git仓库中,发展初期项目较少放到一块图的就是一个方便,但是几年下来随着项目、人员、玩法等多了以后逐渐显现出一些问题,主要痛点有以下:1.效率:更新代码缓慢,会下载很多我不关心的内容,既影响开发效率也影响jenkins打包的效率;2.冲突:合并代码冲突率显著增高,而且一旦冲突往往很难解决,兄弟们苦不堪言,代码合并相互推诿;3.权限:需要遵循最小范围、按需授权等原则最大限度保证代码不外泄,现有的“大锅饭”模式显然不满足。

期望

拆分以后每个项目一个git仓库,需要保留历史提交记录,方便以后回溯。

为了说明问题,上图是我以交易业务域为场景假想了一个简化版仓库,trade仓库下涵盖了三个java项目,分别是discount、order、paygate,拆分以后会变成discount、order、paygate三个仓库。

第一次尝试

我初次拿到这个任务的时候想,这个很简单啊,把trade复制三份然后分别改名为trade-order、trade-paygate、trade-discount,并把多余的删除,看起来像这样:

仓库拆分第一步似乎已经完成,接下来看看历史记录有没有丢失:

1.单个文件提交历史是否完整—右键order_readme.txt->git->show history(idea集成的查看文件git历史功能),很完整,没有问题。

2.新仓库提交历史是否完整—右键trade-order->git->show history,初看没什么问题,再看似乎不够完美,trade-order包含了拆分之前所有的提交历史,虽然不影响使用,但提交历史多了同样影响效率,必须再优化一波。

第二次尝试

第一次拆分之后的trade-order之所以包含所有提交历史是因为我选择的拆分策略是将原来的仓库复制出来然后删除多余的项目,对于提交历史并没有特殊处理,git的提交历史在.git目录下,真实的仓库.git目录接近900兆,这次的目标是将多余的提交历史剔除,靠人工剔除不现实,需要寻觅一款趁手的工具来行使清道夫的职责。

网络上对于git仓库拆分大致有三类工具,分别是subtree、filter-branch、filter-repo,filter-repo虽属后起之秀,似乎有取而代之前二者的趋势,同时前二者也有不少的追捧着,一时间不好抉择。

机缘巧合下看到了github官方的一篇文章https://docs.github.com/cn/get-started/using-git/splitting-a-subfolder-out-into-a-new-repository,里面提到的拆分工具也是filter-repo,我也就选择跟风一次,毕竟只是临时用到的一个工具,没必要花太多时间去选型,走不通了立马切换都来得及,毕竟试错的成本很低,这里顺便啰嗦一句,如果是一个技术框架、中间件的选型可不能这么草率,不能简单的说大厂都用了我们就用,还是要结合实际情况去斟酌,比如公司技术栈、团队人员配比、运维熟悉度等多纬度综合考虑,毕竟是要长期运行且替换的代价巨大。

关于git-filter-repo的下载安装请前往推荐阅读2中的地址自行获取,这里就不啰嗦,下面我们直接开始。

1.打开 Git Bash

2.克隆要拆分的仓库

?

| 1 | git clone https:``//xxx/trade |

3.将当前工作目录更改为您克隆的仓库

?

| 1 | cd trade |

4.要从仓库中的其余文件过滤出该子文件夹,请运行 git filter-repo,提供以下信息:

–path FOLDER-NAME:项目中您要从其创建单独仓库的文件夹。

?

| 1 | git filter-repo --path order/ |

5.将仓库改名为trade-order

现在,该仓库应仅包含order目录下的内容。

验证下提交历史:

1.单文件提交历史没有问题,如下图

2.仓库整体提交历史没有问题,只包含order目录下文件的提交历史,没有把其他的带过来,如下图

这次应该是稳了,我跟同事炫耀我的劳动成果,迫切的希望得到他们的赞许,结果换来的却是另一个新问题:“这个结构是不是能优化下,现在仓库是两级trade-order/order,能不能只保留order这一级。”

第三次尝试

虽然上面的“trade-order/order“看起来也能用,但是多一级无用目录的确有点丑陋,而且会徒增新同学的困惑,说干就干,继续优化。

使用–subdirectory-filter指令保留order/下内容并将order提升为根目录

?

| 1 | git filter-repo --subdirectory-filter order/ |

现在目录变成了下面这样

trade-order/

.git/

doc/

order_readme.txt

最后只需要将trade-order改名为order即可大工告成,提交历史也完整的保留了下来。

推荐阅读

1.https://docs.github.com/cn/get-started/using-git/splitting-a-subfolder-out-into-a-new-repository

2.https://github.com/newren/git-filter-repo

3.https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES

文中只是提及了git-filter-repo的部分指令,更多有意思的玩法请前往推荐阅读3中的EXAMPLES自行解锁。

最后献图一张,下雨天拍到一只出来放风的小蜗牛

相关文章:

  • 基于51单片机温度监控Proteus仿真设计_报警值可调
  • 海关 瑞数5.5 找后缀加密入口解析
  • Cadence OrCAD Capture 绘制总线的方法
  • 高薪程序员面试题精讲系列145之前后端如何交互?Swagger你用过吗?
  • MySQL高级十:索引
  • 8月更新| Java on Visual Studio Code
  • 【牛客刷题】每日一练——Java语法的强化
  • 【Java】基础语法 | OOP用法 | 集合框架
  • 架构分析:「转转云平台」的 Kubernetes 实践
  • RHCE之搭建DNS服务器
  • 【进程 进程表】页表通常存在PCB中
  • 关于AbstractQueuedSynchronizer(JDK1.8)的一点理解.
  • 猿创征文 |【算法入门必刷】数据结构-栈(三)
  • 学习编程的第二十五天
  • Java 中 int 和 Integer 的区别,为什么要有包装类?
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【刷算法】求1+2+3+...+n
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angular数据绑定机制
  • CentOS从零开始部署Nodejs项目
  • Cookie 在前端中的实践
  • co模块的前端实现
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • java第三方包学习之lombok
  • Node 版本管理
  • PAT A1092
  • Spring Cloud Feign的两种使用姿势
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vuex 笔记整理
  • windows下如何用phpstorm同步测试服务器
  • 那些被忽略的 JavaScript 数组方法细节
  • 巧用 TypeScript (一)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 实现菜单下拉伸展折叠效果demo
  • 使用 Docker 部署 Spring Boot项目
  • 首页查询功能的一次实现过程
  • 通过git安装npm私有模块
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 追踪解析 FutureTask 源码
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 1.Ext JS 建立web开发工程
  • mysql面试题分组并合并列
  • 容器镜像
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Maven错误Error executing Maven
  • #《AI中文版》V3 第 1 章 概述
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)STM32单片机上位机
  • (二)WCF的Binding模型
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307