JGit的常用功能(提交、回滚,日志查询)
最近项目中要做一个回滚功能,目的是如果这次发布出现了问题,立马回滚到上一次发布的版本,用jgit实现的,具体方法如下:
- public class GitUtil {
- private final static String GIT = ".git";
- /**
- * 将文件列表提交到git仓库中
- * @param gitRoot git仓库目录
- * @param files 需要提交的文件列表
- * @return 返回本次提交的版本号
- * @throws IOException
- */
- public static String commitToGitRepository(String gitRoot, List<String> files) throws Exception {
- if (StringUtils.isNotBlank(gitRoot) && files != null && files.size() > 0) {
- File rootDir = new File(gitRoot);
- //初始化git仓库
- if (new File(gitRoot + File.separator + GIT).exists() == false) {
- Git.init().setDirectory(rootDir).call();
- }
- //打开git仓库
- Git git = Git.open(rootDir);
- //判断是否有被修改过的文件
- List<DiffEntry> diffEntries = git.diff()
- .setPathFilter(PathFilterGroup.createFromStrings(files))
- .setShowNameAndStatusOnly(true).call();
- if (diffEntries == null || diffEntries.size() == 0) {
- throw new Exception("提交的文件内容都没有被修改,不能提交");
- }
- //被修改过的文件
- List<String> updateFiles=new ArrayList<String>();
- ChangeType changeType;
- for(DiffEntry entry : diffEntries){
- changeType = entry.getChangeType();
- switch (changeType) {
- case ADD:
- updateFiles.add(entry.getNewPath());
- break;
- case COPY:
- updateFiles.add(entry.getNewPath());
- break;
- case DELETE:
- updateFiles.add(entry.getOldPath());
- break;
- case MODIFY:
- updateFiles.add(entry.getOldPath());
- break;
- case RENAME:
- updateFiles.add(entry.getNewPath());
- break;
- }
- }
- //将文件提交到git仓库中,并返回本次提交的版本号
- AddCommand addCmd = git.add();
- for (String file : updateFiles) {
- addCmd.addFilepattern(file);
- }
- addCmd.call();
- CommitCommand commitCmd = git.commit();
- for (String file : updateFiles) {
- commitCmd.setOnly(file);
- }
- RevCommit revCommit = commitCmd.setCommitter(Constants.USERNAME, Constants.EMAIL)
- .setMessage("publish").call();
- return revCommit.getName();
- }
- return null;
- }
- /**
- * 将git仓库内容回滚到指定版本的上一个版本
- * @param gitRoot 仓库目录
- * @param revision 指定的版本号
- * @return true,回滚成功,否则flase
- * @throws IOException
- */
- public static boolean rollBackPreRevision(String gitRoot, String revision) throws IOException {
- Git git = Git.open(new File(gitRoot));
- Repository repository = git.getRepository();
- RevWalk walk = new RevWalk(repository);
- ObjectId objId = repository.resolve(revision);
- RevCommit revCommit = walk.parseCommit(objId);
- String preVision = revCommit.getParent(0).getName();
- git.reset().setMode(ResetType.HARD).setRef(preVision).call();
- repository.close();
- return true;
- }
- /**
- * 查询本次提交的日志
- * @param gitRoot git仓库
- * @param revision 版本号
- * @return
- * @throws Exception
- */
- public static List<DiffEntry> getLog(String gitRoot, String revision) throws Exception {
- Git git = Git.open(new File(gitRoot));
- Repository repository = git.getRepository();
- ObjectId objId = repository.resolve(revision);
- Iterable<RevCommit> allCommitsLater = git.log().add(objId).call();
- Iterator<RevCommit> iter = allCommitsLater.iterator();
- RevCommit commit = iter.next();
- TreeWalk tw = new TreeWalk(repository);
- tw.addTree(commit.getTree());
- commit = iter.next();
- if (commit != null)
- tw.addTree(commit.getTree());
- else
- return null;
- tw.setRecursive(true);
- RenameDetector rd = new RenameDetector(repository);
- rd.addAll(DiffEntry.scan(tw));
- return rd.compute();
- }
- }
JGit的常用功能(提交、回滚,日志查询)的更多相关文章
- MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结
MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...
- mysql回滚日志
一.回滚日志(undo log) 1.作用 保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读 2.内容 逻辑格式的日志,在执行undo的时候 ...
- python logging 实现的进程安全的文件回滚日志类
python标准库中的logging模块在记录日志时经常会用到,但在实际使用发现它自带的用于本地日志回滚的类 logging.handlers.RotatingFileHandler 在多进程环境下会 ...
- SVN 提交回滚
取消对代码的修改分为两种情况: 第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...
- sourceTree"重置提交"和"提交回滚"的区别
相信用过sourceTree的伙伴们都认识这两,但是不一定用过这两个功能,甚至是不能很好的把握它两的区别,根据自己最近亲身测试,总算是能小小的总结一下了 首先这儿假如,历史版本已经出现了1.2.3.4 ...
- [转]SQLServer添加UPDATE回滚日志(update/delete/insert)
下面直接上代码(copy到你的数据库里面直接就可以运行): CREATE PROCEDURE [dbo].[SP_UPDATE_LOG] ) AS BEGIN SET NOCOUNT ON; IF N ...
- Log4net入门(回滚日志文件篇)
在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会 ...
- Jfinal中手动提交/回滚 事物
在Jfinal中有个Tx类为事物声明类 在方法或controller上面加@Before({Tx.class})即可,可是这样并不能满足有的业务场景 下面是今天写的手动提交的事物处理方法,希望对大家有 ...
- C#代码启用事务锁Transaction进行一系列提交回滚操作
一.前言 因为很多人一般进行一系列相关数据库操作都是在存储过程里面,而且在存储过程用锁的写法也是很简单的,在这篇文章主要介绍一下C#后台代码用锁进行一系列事务操作,我建立一个简单的winform程序, ...
- JDBC事务提交/回滚实例
以下是使用事务教程中描述的提交和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数据库设置编写的. 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 ...
随机推荐
- 解决 -Code 安装似乎损坏。请重新安装
问题: 1. 安装插件 fix VSCode Checksums 2. ctrl+shift+P打开命令面板 3. 输入 Fix Checksums: Apply 4. 重新启动VSCode
- 装有docker的虚拟机环境ping宿主机失败
当我用docker network create 创建了一个网络后 [root@localhost ~]# docker network create kong-net 5c035564f9b4649 ...
- 驻扎初篇(markdown)
markdown的初级使用语法 本片作为开始使用博客的第一篇笔记 只为了方便为日后的编辑博客做基础的语言记录 以下为markdown的语法 ##标题 # 标题一 ## 标题二 ### 标题三 #### ...
- KubeSphere 社区双周报 | Fluent Operator 2.6.0 发布 | 2023.11.10-11.23
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 使用 KubeSphere 和极狐GitLab 打造云原生持续交付系统
KubeSphere 简介 Kubernetes 是一个非常复杂的容器编排平台,学习成本非常高,KubeSphere 所做的事情就是高度产品化和抽象了底层 Kubernetes,是一个面向云原生的操作 ...
- kaggle数据集某咖啡店的营销数据分析
因为还处于数据分析的学习阶段(野生Python学者),所以在kaggle这个网站找了两个数据集来给自己练练手. 准备工作 import pandas as pd import os import ma ...
- Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin” 开源项目 生成二维码
Java 当中使用 "google.zxing "开源项目 和 "github 的 qrcode-plugin" 开源项目 生成二维码 @ 目录 Java 当中 ...
- .NET 隐藏/自定义windows系统光标
本文介绍如何操作windows系统光标.正常我们设置/隐藏光标,只能改变当前窗体或者控件范围,无法全局操作windows光标.接到一个需求,想隐藏windows全局的鼠标光标显示,下面讲下如何操作 先 ...
- manim边学边做--极坐标平面
PolarPlane,顾名思义,是用于创建极坐标平面的类. 与笛卡尔坐标系不同,极坐标系是基于角度和半径来定位点的,这里的每个点由一个角度和距离原点的距离表示. 在Manim中,PolarPlane通 ...
- 3.2 Linux文件系统到底有什么用处?
Linux 上常见的文件系统是EXT3或EXT4,但这篇文章并不准备一上来就直接讲它们,而希望结合Linux操作系统并从文件系统建立的基础--硬盘开始,一步步认识Linux的文件系统. 1.机械硬盘的 ...