最近项目中要做一个回滚功能,目的是如果这次发布出现了问题,立马回滚到上一次发布的版本,用jgit实现的,具体方法如下:

  1. public class GitUtil {
  2. private final static String GIT = ".git";
  3. /**
  4. * 将文件列表提交到git仓库中
  5. * @param gitRoot git仓库目录
  6. * @param files 需要提交的文件列表
  7. * @return 返回本次提交的版本号
  8. * @throws IOException
  9. */
  10. public static String commitToGitRepository(String gitRoot, List<String> files) throws Exception {
  11. if (StringUtils.isNotBlank(gitRoot) && files != null && files.size() > 0) {
  12. File rootDir = new File(gitRoot);
  13. //初始化git仓库
  14. if (new File(gitRoot + File.separator + GIT).exists() == false) {
  15. Git.init().setDirectory(rootDir).call();
  16. }
  17. //打开git仓库
  18. Git git = Git.open(rootDir);
  19. //判断是否有被修改过的文件
  20. List<DiffEntry> diffEntries = git.diff()
  21. .setPathFilter(PathFilterGroup.createFromStrings(files))
  22. .setShowNameAndStatusOnly(true).call();
  23. if (diffEntries == null || diffEntries.size() == 0) {
  24. throw new Exception("提交的文件内容都没有被修改,不能提交");
  25. }
  26. //被修改过的文件
  27. List<String> updateFiles=new ArrayList<String>();
  28. ChangeType changeType;
  29. for(DiffEntry entry : diffEntries){
  30. changeType = entry.getChangeType();
  31. switch (changeType) {
  32. case ADD:
  33. updateFiles.add(entry.getNewPath());
  34. break;
  35. case COPY:
  36. updateFiles.add(entry.getNewPath());
  37. break;
  38. case DELETE:
  39. updateFiles.add(entry.getOldPath());
  40. break;
  41. case MODIFY:
  42. updateFiles.add(entry.getOldPath());
  43. break;
  44. case RENAME:
  45. updateFiles.add(entry.getNewPath());
  46. break;
  47. }
  48. }
  49. //将文件提交到git仓库中,并返回本次提交的版本号
  50. AddCommand addCmd = git.add();
  51. for (String file : updateFiles) {
  52. addCmd.addFilepattern(file);
  53. }
  54. addCmd.call();
  55. CommitCommand commitCmd = git.commit();
  56. for (String file : updateFiles) {
  57. commitCmd.setOnly(file);
  58. }
  59. RevCommit revCommit = commitCmd.setCommitter(Constants.USERNAME, Constants.EMAIL)
  60. .setMessage("publish").call();
  61. return revCommit.getName();
  62. }
  63. return null;
  64. }
  65. /**
  66. * 将git仓库内容回滚到指定版本的上一个版本
  67. * @param gitRoot 仓库目录
  68. * @param revision 指定的版本号
  69. * @return true,回滚成功,否则flase
  70. * @throws IOException
  71. */
  72. public static boolean rollBackPreRevision(String gitRoot, String revision) throws IOException {
  73. Git git = Git.open(new File(gitRoot));
  74. Repository repository = git.getRepository();
  75. RevWalk walk = new RevWalk(repository);
  76. ObjectId objId = repository.resolve(revision);
  77. RevCommit revCommit = walk.parseCommit(objId);
  78. String preVision = revCommit.getParent(0).getName();
  79. git.reset().setMode(ResetType.HARD).setRef(preVision).call();
  80. repository.close();
  81. return true;
  82. }
  83. /**
  84. * 查询本次提交的日志
  85. * @param gitRoot git仓库
  86. * @param revision  版本号
  87. * @return
  88. * @throws Exception
  89. */
  90. public static List<DiffEntry> getLog(String gitRoot, String revision) throws Exception {
  91. Git git = Git.open(new File(gitRoot));
  92. Repository repository = git.getRepository();
  93. ObjectId objId = repository.resolve(revision);
  94. Iterable<RevCommit> allCommitsLater = git.log().add(objId).call();
  95. Iterator<RevCommit> iter = allCommitsLater.iterator();
  96. RevCommit commit = iter.next();
  97. TreeWalk tw = new TreeWalk(repository);
  98. tw.addTree(commit.getTree());
  99. commit = iter.next();
  100. if (commit != null)
  101. tw.addTree(commit.getTree());
  102. else
  103. return null;
  104. tw.setRecursive(true);
  105. RenameDetector rd = new RenameDetector(repository);
  106. rd.addAll(DiffEntry.scan(tw));
  107. return rd.compute();
  108. }
  109. }

JGit的常用功能(提交、回滚,日志查询)的更多相关文章

  1. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  2. mysql回滚日志

    一.回滚日志(undo log) 1.作用 保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读 2.内容 逻辑格式的日志,在执行undo的时候 ...

  3. python logging 实现的进程安全的文件回滚日志类

    python标准库中的logging模块在记录日志时经常会用到,但在实际使用发现它自带的用于本地日志回滚的类 logging.handlers.RotatingFileHandler 在多进程环境下会 ...

  4. SVN 提交回滚

    取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...

  5. sourceTree"重置提交"和"提交回滚"的区别

    相信用过sourceTree的伙伴们都认识这两,但是不一定用过这两个功能,甚至是不能很好的把握它两的区别,根据自己最近亲身测试,总算是能小小的总结一下了 首先这儿假如,历史版本已经出现了1.2.3.4 ...

  6. [转]SQLServer添加UPDATE回滚日志(update/delete/insert)

    下面直接上代码(copy到你的数据库里面直接就可以运行): CREATE PROCEDURE [dbo].[SP_UPDATE_LOG] ) AS BEGIN SET NOCOUNT ON; IF N ...

  7. Log4net入门(回滚日志文件篇)

    在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会 ...

  8. Jfinal中手动提交/回滚 事物

    在Jfinal中有个Tx类为事物声明类 在方法或controller上面加@Before({Tx.class})即可,可是这样并不能满足有的业务场景 下面是今天写的手动提交的事物处理方法,希望对大家有 ...

  9. C#代码启用事务锁Transaction进行一系列提交回滚操作

    一.前言 因为很多人一般进行一系列相关数据库操作都是在存储过程里面,而且在存储过程用锁的写法也是很简单的,在这篇文章主要介绍一下C#后台代码用锁进行一系列事务操作,我建立一个简单的winform程序, ...

  10. JDBC事务提交/回滚实例

    以下是使用事务教程中描述的提交和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数据库设置编写的. 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 ...

随机推荐

  1. ChatGPT “眼”中的开源数据库

    开源作为数据库发展的未来趋势之一,被冠以"数据库弯道超车的法宝"的称号.中国开源数据库产品正处于蓬勃发展的趋势,根据 墨天轮中国数据库流行度 ,截止2023年2月底已有46款开源数 ...

  2. docker-compose -- 创建 redis && mysql

    version: '3' services: nest-admin-web: image: buqiyuan/vue3-antdv-admin:stable container_name: nest- ...

  3. input 的hidden 属性

    hidden 会隐藏input 标签内容显示,不占位置 : <input type="file" name="" id="" ref= ...

  4. HarmonyOS NEXT开发之ArkTS自定义组件学习笔记

    在HarmonyOS中,ArkTS提供了创建自定义组件的能力,允许开发者封装和复用UI代码.以下是关于自定义组件的详细介绍,包括创建自定义组件.页面和自定义组件的生命周期.自定义组件的自定义布局.冻结 ...

  5. KubeSphere 3.3.0 发布:全面拥抱 GitOps

    2022 年 6 月 27 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.3.0 正式发布! CNCF 发布的 2021 年度调查报告指出,容器和 K8s 的事实地位已 ...

  6. 再见,Centos!

    近日,CentOS官方宣布CentOS系列稳定版Linux系统将停止维护,取而代之的是测试版的CentOS Stream,这也意味着CentOS将会退出历史舞台,因此引发了CentOS用户的强烈不满. ...

  7. 在 Kubernetes 中运行 Locust 与 Selenium:安装 Chrome 和 ChromeDriver

    在现代软件开发中,性能和用户体验是至关重要的,而负载测试和自动化测试可以帮助我们实现这一目标.在本文中,我们将讨论如何在 Kubernetes 环境中运行 Locust 和 Selenium,并详细介 ...

  8. att&ack学习笔记4

    初识ATT&CK框架前言:ATT&CK这一概念自2014年提出时起,作为安全分析领域中的前沿研究一直在默默地发挥着自己的影响,但是由于其概念在当时过于超前以至于并没有引起多大反响,直至 ...

  9. 基于案例分析 MySQL 权限认证中的具体优先原则

    在 MySQL 的日常管理过程中,大家或多或少会遇到权限认证相关的问题. 例如,本来能够正常执行的操作,可能在新增一个账号或授权后就突然失败了. 这种现象往往让人误以为是 bug,但很多时候,其实并不 ...

  10. 重温c语言之,7天开整,就是随便的写写,第二天

    一:操作符 除法: 如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3: 如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础 ...