如何使用JGIT在远程仓库获取提交详情记录

  • 第一步:获取一个GIT对象
  • 第二步:根据GIT对象获取所有的版本号
  • 第三步:根据筛选的版本号获取指定的记录

这个是JGIT的API:https://download.eclipse.org/jgit/docs/jgit-2.0.0.201206130900-r/apidocs/org/eclipse/jgit/lib/Ref.html

第一步:获取一个GIT对象

在远程获取GIT时,大部分的时候第一步操作就是将远程仓库的项目克隆到本地,然后对本地的项目进行操作。不同与SVN,SVN可以无需将远程项目克隆到本地。
克隆分为两种,
第一:未使用JGIT之前,所需要的项目已经在本地GIT仓库存在了。
这种情况,需要使用Git.open(new File(“D:\GitCloneRepository” + File.separator + this.pjName));这个方法打开本地的GIT库获取一个GIT对象。
第二:本地没有,这时候就需要去远程仓库获取,代码在下面。克隆的时候需要设置远程的url、远程git的用户名和密码,然后指定本地仓库的位置即可。
下面的代码里,我还获取了,克隆下来项目的所有分支。并展示当前所使用的是哪个分支
!!!!!!JGIT远程获取时,默认获取master分支,使用setCheckFetchedObjects(true)方法,可以克隆所有分支到本地,然后从本地切换分支来操作。(本人使用)
切换分支方法: git.checkout().setCreateBranch(false).setName(branch).call();

    public class GitUtil {private Git git;// git对象private String userName;// 资源库账户private String pwd;// 密码private String giturl;// git地址private String pjName;// 项目名private String branch;// 分支名public GitUtil2(String userName, String pwd, String giturl, String pjName, String branch) throws Exception {this.userName = userName;this.pwd = pwd;this.giturl = giturl;this.pjName = pjName;this.branch = branch;// 如果是空,则默认使用master分支if (null == branch || "".equals(branch)) {branch = "master";}// 初始化一个gitinitGit();
}/*** @方法简介:初始化一个GIT对象*/
public void initGit() throws Exception {// 如果目录存在就先更新后openif (new File("D:\\GitCloneRepository" + File.separator + this.pjName).exists()) {this.git = Git.open(new File("D:\\GitCloneRepository" + File.separator + this.pjName));FetchResult resule = this.git.fetch()// 如果已经存在该库,就使用fetch刷新一下.setCredentialsProvider(new UsernamePasswordCredentialsProvider(this.userName, this.pwd))//远程登录git的凭证.setCheckFetchedObjects(true).call();if (resule == null) {throw new AppException("获取的Git对象已失效");}// 切换分支git.checkout().setCreateBranch(false).setName(branch).call();// 查看当前分支//System.out.println(git.getRepository().getBranch());} else {// 如果不存在就clonethis.git = Git.cloneRepository().setURI(this.giturl).setCredentialsProvider(new UsernamePasswordCredentialsProvider(this.userName, this.pwd)).setCloneAllBranches(true)//获取所有分支.setDirectory(new File(DwtmNames.GitClonePath + File.separator + this.pjName))//指定本地clone库.call();// 查看所clone下的项目的所有分支int c = 0;List<Ref> call = this.git.branchList().call();for (Ref ref : call) {System.out.println("Branch: " + ref + " " + ref.getName() + " " + ref.getObjectId().getName());c++;}System.out.println("Number of branches: " + c);}
}

第二步:根据GIT对象获取所有的版本号

本人的需求是根据版本号的提交时间来筛选时间段内的记录,所以我获取到所有的版本号与提交时间,然后根据时间判断。
以下是获取所有版本号的代码:

   /*** @方法简介: 获取所有的版本号与版本号对应的时间戳*/public ArrayList<HashMap<String, Object>> getGitVersion()throws NoHeadException, GitAPIException, BusinessException, AppException {Iterable<RevCommit> logIterable = this.git.log().call();Iterator<RevCommit> logIterator = logIterable.iterator();//获取所有版本号的迭代器if (logIterator == null) {throw new BusinessException("该项目暂无日志记录");}int row = 0;ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();while (logIterator.hasNext()) {HashMap<String, Object> map = new HashMap<String, Object>();RevCommit commit = logIterator.next();Date commitDate = commit.getAuthorIdent().getWhen();     //提交时间String commitPerson = commit.getAuthorIdent().getName() ;    //提交人String commitID = commit.getName();    //提交的版本号(之后根据这个版本号去获取对应的详情记录)map.put("version", commitID);map.put("commitDate", commitDate);map.put("commitPerson", commitPerson);list.add(row, map);row++;}return list;}

第三步:根据筛选的版本号获取指定的记录

所谓的筛选版本号是根据个人需求来筛选,所以我就没有写自己的筛选,各位可以根据自己的需求来写。
我所了解到JGIT在根据版本号获取记录时,只能根据单个版本号来获取详情,不能根据范围来获取,但是JGIT有Range方法来设定获取范围,只不过这个方法是获取两个版本号之间的信息,这个信息依然只是版本号而不是详情记录。所以我只能根据筛选的多个版本号循环进行单个查询。
GIT存储记录的数据结构是Tree,所以JGIT提供对应的树结构对象TreeWalk,这个树对象的使用我还没有掌握,我所查到的相关资料比较少,各位谅解。

   /*** @方法简介 :根据指定版本号获取版本号下面的详情记录* */@SuppressWarnings("resource")public HashMap<String, Object> getCommitLogList(String revision) throws Exception {HashMap<String, Object> map = new HashMap<String, Object>();// 通过git获取项目库Repository repository = this.git.getRepository();// 根据所需要查询的版本号查新ObjectIdObjectId objId = repository.resolve(revision);//根据版本号获取指定的详细记录Iterable<RevCommit> allCommitsLater = git.log().add(objId).call();if (allCommitsLater == null) {throw new Exception("该提交版本下无当前查询用户的提交记录");}Iterator<RevCommit> iter = allCommitsLater.iterator();RevCommit commit = iter.next();//提交对象Date commitDate = commit.getAuthorIdent().getWhen();//提交时间map.put("commitDate", commitDate);String commitPerson = commit.getAuthorIdent().getName();//提交人map.put("commitPerson", commitPerson);String message = commit.getFullMessage();//提交日志map.put("message", message);// 给存储库创建一个树的遍历器TreeWalk tw = new TreeWalk(repository);// 将当前commit的树放入树的遍历器中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));//获取到详细记录结果集    在这里就能获取到一个版本号对应的所有提交记录(详情!!!)List<DiffEntry> list = rd.compute();map.put("list", list);return map;}

我的使用就到此结束了,提交和回滚操作我没有使用到,网上的相关资料比较多一些,初次写这种东西,看到的人如有好的建议请指出,本人虚心接受。

如何使用JGIT在远程仓库获取提交详情记录相关推荐

  1. IDEA配置git,并从远程仓库获取代码分支

    1.首先本地安装git,网上资料很全就不在这展示了. 2.IDEA配置git 2.1:首先点击file-- Settings--Version Control -- Git 将本地安装的git目录粘贴 ...

  2. jgit查询远程仓库_通过 JGit 访问 Git 仓库

    一个Git库仓在 JGit里面表现为Repository类,该类可以看作是这个库的句柄.通过Repository类实例,你可以创建JGit命令以及可以控制配置.参数等. 获取Git库仓的引用有很多种方 ...

  3. jgit查询远程仓库_JAVA 使用jgit管理git仓库

    JAVA 使用jgit管理git仓库 最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下. JGit是一款pure java的软件包,可以读写git仓库,下面介绍 ...

  4. jgit查询远程仓库_java 使用jgit 操作 git

    如果你想在一个 Java 程序中使用 Git ,有一个功能齐全的 Git 库,那就是 JGit . JGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用 ...

  5. Git远程仓库的提交 及常见错误及解决方法

    1.git init 2.ls 3.git add .(将变更提交至缓存区) 4.git commit -m '创建项目' (提交说明) 如果更新之前代码,执行下面一行即可 $ git push or ...

  6. 使用Git命令从远程仓库获取项目代码

    1.第一步查看本地配置信息:使用如下命令 git config --list 2.第二步查看git用户名:检查是否是指定的用户名 git config user.name 3.第三步查看邮箱配置:检查 ...

  7. 【全网最全面】SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)...

    前言: 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Github Desktop.Tortois ...

  8. 已推送到远程仓库的项目如何让本地回退后和远程仓库版本保持一致,也就是如何回退本地,远程仓库代码重新提交?...

    1.远程仓库重新提交必须和提交前的changeId和jiraId号保持一致 流程: 1.git reset 要回退到哪个版本的版本号 2.进行增删改操作 3.git add -A 4. git com ...

  9. Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取

    1. 高频命令 git add 将工作文件修改提交到本地暂存区. git add . 将所有修改过的工作文件提交暂存区(常用). git commit -m "XXX" 为本次修改 ...

  10. git远程仓库和分支

    管理远程仓库需要知道如何添加远程仓库.移除无效的远程仓库.管理各种远程分支和设置是否跟踪这些分支 仓库与分支 2. 显示远程仓库 Git remote命令列出每个远程仓库的简短名称,在克隆某个仓库之后 ...

最新文章

  1. 记一次工作中的小BUG
  2. php正则引用不能计算,php正则表达式 后向引用~
  3. MappedByteBuffer以及ByteBufer的底层原理
  4. OSPF第十章:OSPF 一
  5. python计算precision,recall,f1-score
  6. Nginx+tomcat+memcached缓存共享session
  7. win10文件夹加密_在Windows10中轻松创建隐形文件夹,为数据安全加把锁
  8. var radioname = new array();_兰帕德:引进VAR是为了回放关键时刻的情况,他们的行为令我困惑...
  9. 【数据结构】30、hashmap=》hash 计算方式
  10. 南华大学计算机专业导师排名,南华大学研究生导师介绍:左国平-中公研招网...
  11. Orchard详解--第八篇 拓展模块及引用的预处理
  12. 程序设计原则之SOLID原则
  13. matlab 交互效应三维图,【MATLAB】使用MATLAB绘制心理学中的交互作用图
  14. css3中transform:translateY之后文字模糊的原因
  15. Redis 哨兵安装-Centos
  16. 2020 年 Python 知识清单(网络爬虫)
  17. android 左右声道,android耳机左右声道接反具体修正方法
  18. 最新微信合成大西瓜小游戏(合成版)源码+附带流量主功能
  19. java实现Word 文档形式的导出功能
  20. Matlab通过整除判断倍数

热门文章

  1. IIS发布网站及网页显示设置
  2. 【贪玩巴斯】带你一起攻克英语语法长难句—— 第六章——英语的特殊结构 ——2022年3月19日-20日
  3. 向量ab怎么用计算机打出来,向量怎么用wps打出来
  4. 三星n8000平板_三星n8000拆机方法介绍【图解】
  5. opencv3.0 截取任意形状封闭图形
  6. webgis中等值面生成技术之-arcgis 用自带工具生成等值面并其发布成gp服务
  7. 冒泡详解(分析每一步)
  8. 肯德尔相关性分析_肯德尔的Tau机器学习相关性
  9. Chapter6 机器人系统仿真(Ⅰ)---使用rviz集成urdf、xacro建造机器人模型
  10. 懵逼树懵逼果 树下的你和猫警长