IntelliJ IDEA下基于Scala实现的Git检查工具

这篇具有很好参考价值的文章主要介绍了IntelliJ IDEA下基于Scala实现的Git检查工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IntelliJ IDEA下基于Scala实现的Git检查工具,Java,java,git,代码合并,代码冲突,代码污染,原力计划

本文使用Scala实现自定义的Git检查工具,读者可以基于本文的示例进行扩展与实现,也可以进行其他应用方向的尝试。

01、Git检查工具

在实现Git检查工具之前需要知道程序究竟要做什么。我们知道,在管理Git分支时可以进行代码合并操作,这样可以将其他开发者提交的内容同步到当前分支中,当用户对自己的分支进行提交时就不会与现有版本产生冲突。

反向合并也可以理解为一种回合,在用户使用GitLab等版本管理软件时经常会出现这种现象,但是反向合并带来了十分严重的问题: 代码污染。

可以这样理解,用户分支是介于生产分支与测试分支中间的媒介,它必须保证与两种分支的匹配性问题,即文件差异性问题。通常用户分支是基于生产拉取出来的全新分支,而很多开发者都试图使用这个分支进行修改并提交到测试分支进行测试发布。

在理想情况下项目的测试分支与生产分支应该是一致的,因此反向合并容易被修改或纠正,但是在测试分支与生产分支差异较大的时候,反向合并会将测试分支中的内容合并到用户分支中,如果用户分支被提交到生产分支上,则将会产生不可恢复的灾难。

基于上述原因,我们使用Scala设计一款简单的检查工具,它可以检查指定分支或分支组中所有的提交信息,并从这些信息中过滤出带有回合操作的历史。

如果发生过反向合并的操作,则在Git提交历史记录中通常会带有Mergeremotetrackingbranch...的字样信息,但是带有这种信息的提交并不一定都产生了合并问题。

当通过Git检查工具过滤出符合上述特征的分支后,可以通过判断与生产分支的差异数量并设定一个判断阈值的方式再次深度过滤或直接人工观察用户分支的差异化等多种方式来确保上线分支的准确性。

02、编写配置

在Git版本控制管理章节里提到过,反向合并会对开发者的项目分支带来污染,因此可以实现一个用于Git分支检查的工具,这样在每次例行版本维护时可以帮助我们快速定位反向合并的问题。

工具不一定能解决所有的问题,因为每个问题的出现都有其随机性,但是工具却能从某些方面提升我们的效率。读者在学习完本章后,可以根据需要自行扩展并定制更多的功能。

首先在resources资源目录下,创建一个名为config.conf的文件,它用于Git检查工具的基础配置。config.conf配置文件中定义了本地Git项目的根目录及待检查的分支,代码如下:

{
  group1 = {
    workDir = "Git项目目录"
  }
  group2 = {
    workDir = "Git项目目录"
    base = master
    branches = [
      user_local_branch
    ]
  }
}

 文章来源地址https://www.toymoban.com/news/detail-662888.html

在上述配置中对待检查目标进行了分组,运行时用户可以将需要对比的项目及分支预先定义好,这样可以在项目启动后通过接收参数的方式来动态调整使用哪一组配置进行目标分支的检查与分析。

在每一组配置里,workDir指定本地Git项目的根目录。base用于指定项目的主分支(master)。branches是一个分支列表,它代表了待检查的分支,这些分支既可以是本地分支,也可以是远程分支。如果是远程分支,则通常要在其前面添加origin/前缀。

接下来定义一个用于控制日志输出的配置文件,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <properties>
        <property name="APP_HOME">$${env:APP_HOME}</property>
        <property name="LOG_HOME">${APP_HOME}/logs</property>
        <property name="mainFilename">${LOG_HOME}/vh.log</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level - %msg%n" />
        </Console>
        <RollingFile name="FileMain" fileName="${mainFilename}"
                     filePattern="${LOG_HOME}/vh%date{yyyyMMdd}_%i.log.gz">
            <PatternLayout>
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %level - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <CronTriggeringPolicy schedule="0 0 0 * * ?" evaluateOnStartup="true"/>
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="FileMain" />
        </Root>
    </Loggers>
</Configuration>

03、编写启动程序

接下来编写项目的启动程序,启动程序可以接收外界传入的参数以实现不同配置的切换使用,代码如下:

package com.scala.git
import org.slf4j.LoggerFactory

object MainCheck {
  private val log = LoggerFactory.getLogger(getClass)
  def main(args: Array[String]): Unit = {
    log.info(s"接收外界传递的切换配置: ${args.group}")
    var group = "group2"
    if(args.length > 0){
      group = args(0)
    }
    log.info(s"当前配置为$group")
    group match {
      case "group2" => CheckTask.main(args)
      case _ => log.error(s"not found $group")
    }
  }
}

 

因为Scala程序可以与Java语言混合编写,因此Java开发人员在阅读Scala程序时相对容易理解一些。

在MainCheck对象的主方法中接收了外界传递进来的group参数,它可以在程序启动时动态传递到主方法中并替代默认配置组group2。

接下来通过match操作对group变量所代表的分组配置进行匹配,如果匹配成功,则执行对应用的功能调用。如果匹配不上,则输出日志提示。

04、编写校验逻辑

在MainCheck.scala应用程序中,当外界变量group匹配成功后会调用具体的执行逻辑,此逻辑封装在CheckTask对象方法中。

在编写CheckTask对象之前先来编写GitUtil.scala程序文件,其作用为调用并执行CMD命令以便获取指定分支的所有提交信息,这些提交信息将以数组的形式返回,代码如下:

package com.scala.util
import java.io.File
import org.slf4j.LoggerFactory

import scala.sys.process.{Process, ProcessLogger}

object GitUtil {
  private val isWin = System.getProperty("os.name").toLowerCase.contains("Windows")
  private val log = LoggerFactory.getLogger(getClass)

  def getCommits(from: String, to: String, workDir: String): String = {
    val cols = Array("%H", "%s", "%an", "%ae", "%ci")
    val tem = from + ".." + to + " --pretty=format:\"" + cols.mkString("/") + "\"";
    val value = cmdCommits(s"git log " + tem, new File(workDir))
    value
  }

  def cmdCommits(cmd: String, workDir: File): String = {
    var commits:Array[String] = null;
    if(!isWin){
      commits = cmd.split("\\s")
    }else{
      commits = Array("cmd", "/c") ++ cmd.split("\\s")
    }
    Process(commits, workDir).!!(ProcessLogger(s => log.error(s"err => $s")))
  }
}

 接下来实现CheckTask.scala程序文件,代码如下:

package com.scala.git

import com.scala.util.GitUtil
import com.typesafe.config.ConfigFactory
import scala.collection.JavaConverters._

object CheckTask {

  private val config = ConfigFactory.load("config.conf").getConfig("group2")
  private val orderWorkDir = config.getString("workDir");
  private val base = config.getString("base");
  private val branchs = config.getStringList("branchs");

  def main(args: Array[String]): Unit = {
    println(s"参照对比分支[$base]")
    println(s"待检查分支集合$branchs")
    checkBraches(base, asScalaBuffer(branchs).toArray).foreach(b => println(s"发现可疑分支 $b"))
  }
  
  def checkBraches(base: String, brans: Array[String]): Array[String] = {
    brans.filter(b => checkMergeError(base, b))
  }

  private def checkMergeError(base: String, target: String): Boolean = {
        println(s"对比分支:$base,检查分支:$target")
        //取得所有提交信息
        val commits = getDiffCommits(base, target)
        //从历史提交记录过滤出回合过的分支
        val targets = commits.filter(isMergeReverse)
        targets.foreach(c => {println(c.mkString("\t"))})
        println(s"分支[$target]中可疑提交次数: ${targets.length}")
        targets.length != 0
  }

  private def isMergeReverse(messages: Array[String]): Boolean = {
    val msg = messages(1)
    if(msg.startsWith("Merge branch 'int_") || msg.startsWith("Merge remote-tracking branch ")){
      val splits = msg.split("\\s")
      val end = splits(splits.length-1)
      val flag = end.startsWith("int_") || end.startsWith("local_int_")
      return !flag
    }
    false
  }

  private def getDiffCommits(from: String, to: String): Array[Array[String]] = {
    GitUtil.getCommits(from, to, orderWorkDir).lines.map(_.split("/")).toArray
  }
}

现在尝试运行工具,随便选取系统中的某个Git项目并修改config.conf配置文件以使其与Git项目中的分支对应,然后运行MainCheck.scala程序文件,运行效果如图1所示。

IntelliJ IDEA下基于Scala实现的Git检查工具,Java,java,git,代码合并,代码冲突,代码污染,原力计划

■ 图1 运行Git检查工具

 

 

 

 

 

 

到了这里,关于IntelliJ IDEA下基于Scala实现的Git检查工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java项目使用intellij-IDEA查看依赖包版本是否有冲突(方法及工具)附截图

    编译器及版本 idea-ultimate 依赖管理工具 maven Step1:点击右侧的maven Step2:右键依赖项,点击分析依赖关系 Step3:可以在模块名位置进行切换,左侧三角的标志则表示该包引入了多个版本,有冲突 Step4:可以看到当前这个包被引入了两个版本的 Step5:右键冲突的包名,可以看到

    2024年02月15日
    浏览(97)
  • Java后端项目IDEA配置代码规范检查,使用checkStyle实现

    最近的Java后端项目想实现代码的规范检查,调研了一圈,终于找到了简单的方式实现:以下是常见的几种方案: 1、在客户端做 git hook,主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很明显,就是在本地把这个钩子删了、或者 git commit

    2024年01月17日
    浏览(41)
  • Intellij IDEA如何使用Git

    使用Git的步骤如下: 安装Git:首先需要在你的计算机上安装Git。你可以从Git的官方网站(Git - Downloads)下载适合你操作系统的安装包,并按照提示进行安装。 IDEA中配置Git:在Settings - Version Control - Git,如下(IDEA版本不一样界面会有不同) IDEA中的VCS快捷操作和菜单栏熟悉: 如果没

    2024年01月23日
    浏览(62)
  • IntelliJ IDEA 如何配置git?

    在IntelliJ IDEA中配置Git可以让你方便地进行版本控制、代码提交和协作开发。下面是一些简单的步骤,帮助你配置Git: 首先,确保你已经在你的计算机上安装了Git。你可以从Git官方网站(https://git-scm.com/downloads)下载并安装适合你操作系统的版本。 打开IntelliJ IDEA,点击顶部菜

    2024年01月23日
    浏览(59)
  • Intellij IDEA Git使用记录

    代码管理工具从svn改了git,记录一下使用过程。 1、关于查看提交历史 之前用svn的时候直接项目右键 Team–显示资源历史记录,不需要先更新就可以查看到所有的提交历史了;但是git需要先pull或者fetch之后,才能显示出所有的提交记录。 2、关于git分支 git一般不会在主分支开

    2024年02月12日
    浏览(61)
  • IntelliJ IDEA 忽略Git提交

    在项目下新建 .gitignore 文件 在 .gitignore 文件写入以下内容,从上图可以看到,忽略提交的这些目录/文件变成了黄色

    2024年02月17日
    浏览(66)
  • 在IntelliJ IDEA中配置Git

    给大家说说在inteliJ IDEA中如何配置git: 目录 下载安装Git工具 在IntelliJ IDEA中配置Git 在IntelliJ IDEA中利用Git拉取项目 1. 访问gitee或github,找到项目对应的仓库,并复制仓库地址。 2 打开IDEA,依次选择菜单:File-New-Project from Version Control .  3 在弹出框中输入仓库路径(从第一步中git

    2024年02月16日
    浏览(55)
  • IntelliJ:idea Git拉取代码

    1、任意打开一个项目后,点击File-点击New-Project from Version Control-点击Git   2、弹出下面框,URL:git地址,Directory:拉取代码到本地目录   3、将获取到的git地址复制到URL里面,再点击Test    4、点击Test将会弹出以下模态框,输入申请的git账号、密码,点击Log In    5、再点击C

    2024年02月11日
    浏览(67)
  • 在IntelliJ IDEA中使用Git

    想要在IntelliJ IDEA中使用Git,首先需要下载Git,Git的安装可以参考我的另一篇文章https://blog.csdn.net/manfanying/article/details/128679367 然后打开idea,点击左上角的file,再点击settings 找到Version Control并将其展开,点击Git ,找到Git的安装路径,打开bin目录,选择Git.exe并点击Test测试 如果

    2024年02月08日
    浏览(49)
  • IntelliJ IDEA 配置git详细步骤

    IDEA项目代码太多了,上传到github/gitlab/gitee上面进行管理吧,方便及时版本回退或者更新。也比较方便团队合作。(笔者换电脑了,重新记录下配置git过程) 下载网址:https://git-scm.com/download win系统下载网址:https://git-scm.com/download/win 我是是win10,mac or linux也是同样的步骤,先

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包