课题:如何实现代码分支检测功能课题:如何实现代码分支检测功能 前言 最近伴随着主线任务结尾,终于腾出部分时间回归课题的研
课题:如何实现代码分支检测功能
前言
最近伴随着主线任务结尾,终于腾出部分时间回归课题的研究。
本文将围绕版本分支检测算法从JGit使用、Cherry pick 和 Merge 区别、版本分支检测算法等几方面展开。
关于课题想要实现的功能
分支合并检测需求背景
各个项目团队成员协同开发、对git同一分支产生提交记录容易杂乱且不容易追溯。
解决痛点
检测分支合并是否存在异常:如漏合并、是否合并等。减少开发因为代码分支合并而造成的浪费时间等现象。
比如某一成员在发版前修改了代码,但没有合并上线分支,此时上线分支构建镜像还是旧的。
而本文我们聊得则是课题中的某一功能分支检测
聊一聊JGit
和ProcessBuilder
什么是ProcessBuilder
?
ProcessBuilder
类是Java1.5
引入的,用于创建和管理操作系统进程,用于执行外部命令。
- 启动新进程:例如启动一个命令行工具、脚本或者另一个 Java 程序。
- 控制进程环境:可以设置新进程的工作目录、环境变量等。
- 可以使用ProcessBuilder来启动一个 Git 命令行工具来执行 Git 操作。
什么是JGit
?
JGit
是一个纯 Java 实现的 Git 版本控制系统库。主要功能如下:
- 独立实现:使用
JAVA
语言实现不依赖外部的Git可执行文件。这使得它可以在任何支持 Java 的环境中使用,包括嵌入式系统和服务器端应用程序。 - 功能全面:涵盖大部分
Git
的功能,可以与本地和远程Git仓库进行交互。 - 易于集成:容易集成
Java
应用程序,适用构建自动化构建系统、持续集成服务器、代码审查工具等。
为什么使用JGit
而不是通过 ProcessBuilder
构建命令行?
- 跨平台性和可移植性:
JGit
是纯Java
实现,不依赖于特定操作系统的Git
安装。这意味着无论在Windows
、Linux
还是macOS
等平台上,只要有 Java 运行环境,就可以使用 JGit 进行版本控制操作,还有一点就是使用ProcessBuilder
构建的命令行在不同版本操作系统可能存在差异。 - 使用
ProcessBuilder
构建命令行操作Git
依赖于系统上安装的Git
可执行文件。不同操作系统上的 Git 版本可能不同,命令的输出和行为也可能略有差异。这会增加应用程序在不同平台上的维护成本和不确定性。 - 安全性:
JGit
通过 Java API 进行操作,避免了直接调用外部命令可能带来的安全风险,如命令注入攻击。由于所有的操作都在 Java 代码中进行控制,可以更好地管理和验证输入参数,降低安全漏洞的可能性。 - 稳定性:
JGit
经过了广泛的测试和优化,具有较高的稳定性。它在处理各种复杂的版本控制场景时,能够提供可靠的结果,减少因外部命令执行失败或异常导致的应用程序崩溃或不稳定情况。
综上所述,JGit
在跨平台性、安全性、稳定性、灵活性和可扩展性等方面具有明显优势,所以本次课题功能我们将使用JGit技术来实现Git命令交互。
聊一聊Cherry pick 和 Merage
Cherry pick
(优选):将一个分支上的代码提交应用到另一个分支上,产生多条提交记录(哈希值不唯一)
- 定义与作用
cherry pick
允许你从一个分支中选择特定的一个或多个提交,并将其应用到另一个分支上。这在需要将特定的修改从一个分支引入到另一个分支时非常有用,而无需合并整个分支的历史。- 例如,假设你在一个开发分支上修复了一个重要的 bug,你可以使用cherry pick将这个 bug 修复的提交应用到其他需要这个修复的分支上,如稳定分支或发布分支。
- 优点
- 精准性:只选择特定的提交,避免引入不必要的更改。这对于只需要特定修改而不想合并整个分支的复杂历史非常有用。
- 灵活性:可以从任何分支拣选提交到当前分支,不受分支之间直接关系的限制。
- 缺点
- 可能导致冲突:如果拣选的提交与目标分支上的现有代码存在冲突,需要手动解决这些冲突。
- 不保留原始提交历史关系:拣选的提交在目标分支上是独立的,不保留与原始分支的提交历史关系。
因为Cherry pick
是将记录从一个分支上作用于其他分支,所以并不会保留历史关系。不方便追溯,在本次版本分支检测功能中针对cherry up的分支检测也无法通过使用唯一哈希值进行判断。
Merage
(合并):merge
操作将两个分支的历史合并在一起,创建一个包含两个分支更改的新提交。
- 定义与作用
- merge操作将两个分支的历史合并在一起,创建一个包含两个分支更改的新提交。通常用于将一个分支的更改集成到另一个分支中。
- 例如,当一个功能分支上的开发完成后,可以将其合并到主分支上,以整合新的功能。
- 优点
- 完整的历史记录:保留了两个分支的提交历史关系,使得可以追溯代码的发展过程。
- 一次性合并多个提交:可以将一个分支上的一系列提交一次性合并到目标分支上。
- 缺点
- 可能引入大量无关更改:如果合并的分支上有很多与当前任务无关的提交,可能会使目标分支变得混乱。
- 冲突解决可能更复杂:如果两个分支上对同一部分代码进行了不同的修改,合并时可能会出现复杂的冲突,需要花费更多的时间来解决。
应用场景对比:
Cherry Pick
适用紧急Bug修复、选择性代码合并Merage
适用于常规开发功能代码集成、长期项目分支管理 比如dev->test->prod
例如,在一个软件开发项目中,当发现一个严重的 bug
在开发分支上被修复后,可以使用cherry pick将这个修复快速应用到稳定分支上,以便及时发布修复版本。而在功能开发阶段,当一个功能分支上的新功能开发完成并经过测试后,可以使用merge
将这个分支合并到主分支上,以整合新的功能到项目的主要代码库中。
版本分支检测合并功能
详细思路如下: 首先通过版本号及关键字进行匹配,然后按照顺序进行依次校验。
-
算法检测规则:
- 首先clone远程代码,然后通过切换不同分支分别执行下述操作:
- 从源分支拿到最后一次提交记录时间及哈希值并记录,然后通过哈希值从目标分支进行查询如果直接找到说明分支合并正常。
- 检测顺序为:feature/Vx.x_dev->release/Vx.x_test->release/Vx.x_prod等。
- 如果没有找到,查询是否为cherry-pick操作,通过提交消息中的
cherry picked from commit <hash>
标记来识别cherry-pick
操作 - 如果找到
cherry-pick
操作,记录其时间。 - 如果cherry-pick也没有找到默认此条记录没有进行合并/优选操作,直接获取目标分支最后一条记录的时间及内容并记录。
- 比较源分支的最后一次提交时间和目标分支的最后一次合并或 cherry-pick 时间。如果晚于则检测正常、如果早于目标分支时间则不正常。
- 关于上一条 此时Hashcode及cherry pick的匹配不相同那么时间是必不同的。
-
如何优化:
- 每次clone的操作前,可以先进行校验。如果已经clone过的将默认检出master分支并执行pull拉新操作。而不必再次进行
clone
操作。 cherry pick
进行搜索时搜索目标分支的最近100
条(根据自己的业务应用场景进行设置)而不是全部分支记录再进行匹配。
- 每次clone的操作前,可以先进行校验。如果已经clone过的将默认检出master分支并执行pull拉新操作。而不必再次进行
最后
如果大家对代码感兴趣,集赞满15个赞开源代码!
转载自:https://juejin.cn/post/7426239502009696256