Jgit基础教程(Java调用git)

2023-11-05

前言

最近公司需要做一个java调用git的工具,这里简单的介绍了一下基本操作方法以及一些衍生的信息获取,或有不对的地方请大家批评指正。转载请注明出处。

一、Jgit依赖导入

<dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit</artifactId>
      <version>4.4.1.201607150455-r</version>
    </dependency>

    <dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit.archive</artifactId>
      <version>5.8.1.202007141445-r</version>
    </dependency>

二、Jgit获取Git操作对象

获取Git对象是一切git操作的基础,笔者写了一个方法封装了一下。

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
public class JGitUtils {
public static Git openRpo(String dir){
        Git git = null;
        try {
            Repository repository = new FileRepositoryBuilder()
                    .setGitDir(Paths.get(dir, ".git").toFile())
                    .build();
            git = new Git(repository);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return git;
    }
}

三、基础操作(Base)

1.打开仓库(open)

git命令:

git Bash Here

Jgit代码:
   Git git = jGitUtils.openRpo(localPath); //获取git对象
   System.out.println(git);
参数:
  String localPath = "C:\\Users\\yang.yang\\Desktop\\test";    //本地仓库位置
结果:

在这里插入图片描述

2.初始化(init)

git命令:

git init

Jgit代码:
Git git = Git.init().setDirectory(new File(localPath)).call();
System.out.println(git);
参数:
String localPath = "C:\\Users\\yang.yang\\Desktop\\test1";    //本地仓库位置
结果:

在这里插入图片描述

3.添加到暂存区(Add)

git命令:

git add .

git add Delete.txt

git add Modify.txt

git add Folder/InFolder.txt

Jgit代码:
git.add().addFilepattern(".").call(); //添加全部文件
git.add().addFilepattern("New.txt").call(); 
git.add().addFilepattern("Delete.txt").call();
git.add().addFilepattern("Modify.txt").call();
git.add().addFilepattern("Folder/InFolder.txt").call();
git.rm().addFilepattern("Delete.txt").call();
备注:

删除和移动的文件不能使用git.add(),需要使用git.rm()的方式,就算参数是“.”也需要使用 git.rm()方法

结果:

在这里插入图片描述

4.提交(Commit)

git命令:

git commit -m"first commit"

Jgit代码:
git.commit().setMessage("first commit").call();
结果:

在这里插入图片描述

5.状态(status)

git命令:

git status

Jgit代码:
Map<String,String> map = new HashMap<String,String>();
Git git = jGitUtils.openRpo(localPath);
    Status status = git.status().call();
    map.put("Added",status.getAdded().toString());
    map.put("Changed",status.getChanged().toString());
    map.put("Conflicting",status.getConflicting().toString());
    map.put("ConflictingStageState",status.getConflictingStageState().toString());
    map.put("IgnoredNotInIndex",status.getIgnoredNotInIndex().toString());
    map.put("Missing",status.getMissing().toString());
    map.put("Modified",status.getModified().toString());
    map.put("Removed",status.getRemoved().toString());
    map.put("UntrackedFiles",status.getUntracked().toString());
    map.put("UntrackedFolders",status.getUntrackedFolders().toString());
    System.out.println(map);
备注:

里面记录的我目前已经知道的属性,得到的结果是文件名,还有其他的属性可以自行研究。

结果:

在这里插入图片描述

四、分支操作(Branch)

1.创建分支(Create Branch)

git命令:

git branch dev

Jgit代码:
git.branchCreate()
        .setName("dev") //创建的分支名字
        .call();  
结果:

在这里插入图片描述

2.删除分支(Delete Branch)

git命令:

git branch -d dev

Jgit代码:
git.branchDelete()
        .setBranchNames("dev")   //设置删除分支的名字
        .call();
结果:

在这里插入图片描述

3.切换分支(Checkout Branch)

git命令:

git checkout dev

Jgit代码:
git.checkout()
        .setName("dev") //设置分支名
        .call();
结果:

在这里插入图片描述

4.所有分支(BranchList)

git命令:

git branch

Jgit代码:
List<Ref> call = git.branchList().call();     //得到所有分支信息
for(Ref ref : call)
    System.out.println(ref);
备注:

得到的信息是所有内容,可以用函数处理,例如ref.getName()可得到名字相关内容

结果:

在这里插入图片描述

5.合并分支(Merge Branch)

git命令:

在master分支上使用 git merge dev

Jgit代码:
Ref refdev = git.checkout().setName("dev").call(); //切换分支获取分支信息存入Ref对象里
git.checkout().setName("master").call();   //切换回master分支
MergeResult mergeResult = git.merge().include(refdev)  // 合并目标分支
        .setCommit(true)           //同时提交
        .setFastForward(MergeCommand.FastForwardMode.NO_FF)// 分支合并策略NO_FF代表普通合并
        .setMessage("master Merge dev")     //设置提交信息   //  FF代表快速合并
        .call();
备注:

合并操作是一项危险的操作,我只是做了一个简单尝试,更多的功能还需要自行研究。

结果:

在这里插入图片描述

五、远端仓库操作(Repository)

1.推送(Push)

git命令:

git push origin master

Jgit代码:
CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息
git.push()
        .setRemote("origin")    //设置推送的URL名称
        .setRefSpecs(new RefSpec(branch))   //设置需要推送的分支,如果远端没有则创建
        .setCredentialsProvider(provider)   //身份验证
        .call();
备注:

这种推送需要在已经设置remote的情况下进行。

结果

之前提交的log
在这里插入图片描述
push执行后
在这里插入图片描述

2.拉取(Pull)

git命令:

git pull origin

Jgit代码:
CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息
git.pull()
        .setRemoteBranchName("master")  //设置需要pull的远端分支
        .setCredentialsProvider(provider)  //身份验证
        .call();
结果:

在这里插入图片描述

3.克隆(Clone)

git命令:

git clone http://admin@10.179.2.14:10101/r/Test/test01.git

Jgit代码:
//克隆
CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息
File localpath = new File(localPath);
Git git = Git.cloneRepository()
        .setURI(remotePath)   //设置git远端URL
        .setDirectory(localpath)  //设置本地仓库位置
        .setCredentialsProvider(provider)   //设置身份验证
        .setCloneSubmodules(true)    //设置是否克隆子仓库
        .setBranch(branch)  //设置克隆分支
        .call();   //启动命令
git.getRepository().close();  
git.close();     //关闭源,以释放本地仓库锁
参数:
String localPath = "C:\\Users\\yang.yang\\Desktop\\test";    //本地仓库位置
String remotePath = "http://admin@10.179.2.14:10101/r/Test/test01.git";  //远端仓库URL
String branch = "master";   //克隆目标分支
String userName = "admin";  //远端仓库用户名
String password = "admin";  //远端仓库密码密码
结果:

在这里插入图片描述

4.设置远程连接(Set Remote)

git命令:

git remote master http://admin@10.179.2.14:10101/r/Test/test01.git

Jgit代码:
git.remoteAdd()
        .setName("master")   //设置remote名字
        .setUri(new URIish("http://admin@10.179.2.14:10101/r/Test/test01.git"))  //设置url
        .call();
结果:

在这里插入图片描述

5.删除远程连接(Remove remote)

git命令:

git remote rm master

Jgit代码:
git.remoteRemove()
        .setRemoteName("master")
        .call();
结果:

在这里插入图片描述

6.获取所有远程连接(All Remote)

git命令:

git remote -v

Jgit代码:
Map<String, String> urlMap = new HashMap<>();
    List<RemoteConfig> remoteConfigList = git
            .remoteList()   //获取list
            .call();
    for (RemoteConfig x : remoteConfigList) {
        urlMap.put(x.getName(), x.getURIs().toString());   //获取名字,获取URL
    }
   System.out.println(urlMap);
结果:

六、标签(Tag)

1.创建标签(Create Tag)

git命令:

git -a V1.0 -m “test tag” 9167dadd48bca196208a4687b5d4706e355c42b6

Jgit代码:
 ObjectId id = git.getRepository().resolve("9167dadd48bca196208a4687b5d4706e355c42b6");  //获取提交的ObjectID
            RevWalk walk = new RevWalk(git.getRepository());   //获取RevWalk对象
            RevCommit commit = walk.parseCommit(id);   //获取该commitID的RevCommit对象
            git.tag().setObjectId(commit)  //设置commit
                    .setName("V1.0")  //设置tag名字
                    .setMessage("test tag")  //设置tag注释
//                    .setAnnotated()  //是否为annotate
                    .call();
结果:

在这里插入图片描述

2.所有标签(All Tag)

git命令:

git tag

Jgit代码:
  List<Ref> refList = git.tagList().call();  //获取所有tag
            RevWalk walk = new RevWalk(git.getRepository());
            for (Ref ref : refList) {
                System.out.println("commitID:"+walk.parseCommit(ref.getObjectId()).getName());  // 通过ref获取objectID
                System.out.println("tagName:" + ref.getName());                                 // 然后通过walk获取commit对象再获																								   // 取commitId
            }
结果:

在这里插入图片描述

3.删除标签(Delete Tag)

git命令:

git tag -d V1.0

Jgit代码:
git.tagDelete()
        .setTags("V1.0")   //设置tag名
        .call();
结果:

在这里插入图片描述

4.将标签推送至远程(Push Tag)

git命令:
Jgit代码:
CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息
git.push().setRemote("origin")  //设置remote
        .setPushTags()   //pushtag
        .setCredentialsProvider(provider)
        .call();
备注:

默认是推送当前仓库内所有tag,单个推送目前没找到方法,得自行研究。

结果:

在这里插入图片描述

七、差异对比(Diff)

1.两个版本之间的对比(Between two Commit)

git命令:

git diff HEAD HEAD^

Jgit代码:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            AbstractTreeIterator newTreeIter = prepareTreeParser(git.getRepository(), git.getRepository().resolve("HEAD").getName());
            AbstractTreeIterator oldTreeIter = prepareTreeParser(git.getRepository(), git.getRepository().resolve("HEAD^").getName());
            git.diff()
                    .setNewTree(newTreeIter)  //设置源,不设置则默认工作区和历史最新commit版本比较
                    .setOldTree(oldTreeIter)
//                    .setPathFilter(PathFilter.create(".txt"))  //设置过滤
                    .setOutputStream(outputStream) //输出流  用outputStream,后面转成字符串
                    .call();
            System.out.println(outputStream.toString());
public static AbstractTreeIterator prepareTreeParser(Repository repository, String objectId) throws IOException {
    try (RevWalk walk = new RevWalk(repository)) {
        RevCommit commit = walk.parseCommit(ObjectId.fromString(objectId));
        RevTree tree = walk.parseTree(commit.getTree().getId());
        CanonicalTreeParser treeParser = new CanonicalTreeParser();
        try (ObjectReader reader = repository.newObjectReader()) {
            treeParser.reset(reader, tree.getId());
        }
        walk.dispose();
        return treeParser;
    }
}
备注:

prepareTreeParser是一个把RevCommit对象转换成AbstractTreeIterator方法,Jgit中的Tree和Ref是存储git对象的类,具体作用请阅读文尾的官方文档。

当diff()方法中不指定NewTree和OldTree时,默认比较工作区和当前分支最后一次commit的区别。

结果:

在这里插入图片描述

2.当前暂存区与最后一次提交之间的对比(Current staging area and last commit)

git命令:

git diff

Jgit代码:
git.diff()           
       .setOutputStream(outputStream) //输出流  用outputStream,后面转成字符串
       .call();
System.out.println(outputStream.toString());
结果:

在这里插入图片描述

八、回溯(Reset&Revert)

1.Reset

git命令:

git reset

Jgit代码:
RevWalk walk = new RevWalk(git.getRepository());    //获取walk对象
ObjectId objectId = git.getRepository().resolve("9167dadd48bca196208a4687b5d4706e355c42b6");   //ObjectId对象
RevCommit revCommit = walk.parseCommit(objectId);   //获取Revcommit对象
String perVision = revCommit.getParent(0).getName();   //获取commit的身份名
git.reset().setMode(ResetCommand.ResetType.HARD).setRef(perVision).call();  //设置参数
结果:

在这里插入图片描述

2.Revert

git命令:

git revert

Jgit代码:
RevWalk walk = new RevWalk(git.getRepository());
RevCommit revCommit = walk.parseCommit(ObjectId.fromString(commitid));
git.revert().include(revCommit).call();
结果:

在这里插入图片描述

备注:

Reset和Revert结果比较复杂,演示的只是一个可行的方法,具体应用请查看文尾的官方文档。

九、参考链接

参考文档:https://github.com/centic9/jgit-cookbook

官方文档:http://archive.eclipse.org/jgit/site/5.3.0.201903130848-r/apidocs/index.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jgit基础教程(Java调用git) 的相关文章

  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO$Windows.access0

    做时 new MiniDFSCluster Builder config build 我得到这个异常 java lang UnsatisfiedLinkError org apache hadoop io nativeio NativeIO
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • 在pycharm中升级pip失败和pip安装pytorch torchvision opencv

    pytorch官网 https pytorch org get started locally 查看版本 pip version pip 20 2 3 from c users 14172 pycharmprojects pythonpro
  • ping命令知识详解

    1 Ping的基础知识 Ping 是一个十分好用的TCP IP工具 功能 用来检测网络的连通情况和分析网络速度 2 Ping命令详解 参数意思和使用 t Ping指定的计算机直到中断 a 将地址解析为计算机名 n count 发送 coun
  • Spring--Bean相关

    你对Spring中的bean了解吗 都有哪些作用域 Scope Spring 官方文档对 bean 的解释是 In Spring the objects that form the backbone of your application
  • html2canvas生成图片底部出现白边儿的解决方法

    场景 使用html2canvas的时候 生成的图片底部出现了白边 产生白边原因 可能是由于像素渲染问题导致的 移动设备的屏幕像素密度 Pixel Density 较高 有时会导致在两个相邻元素之间出现细小的间隙或白线 解决方法 将canva
  • 解决 ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES) 问题

    解决 ERROR 1045 28000 Access denied for user root localhost using password YES 问题 最近新装好的mysql在进入mysql工具时 总是有错误提示 mysql u r
  • [leetcode 周赛 150] 1161 最大层内元素和

    目录 1161 Maximum Level Sum of a Binary Tree 最大层内元素和 描述 思路 代码实现 1161 Maximum Level Sum of a Binary Tree 最大层内元素和 描述 给你一个二叉树
  • 网络编程(详)

    一 概述 计算机网络 是指将地理位置不同的具有 独立功能的多台计算机及其外部设备 通过通信线路连接起来 在网络操作系统 网络管理软件及网络通信协议的管理和协调下 实现资源共享和信息传递的计算机系统 网络编程 在网络通信协议下 实现网络互连的
  • MATLAB—GUI新手入门教程

    GUI界面基本操作 1 GUI界面介绍 2 各个控件的使用方法 2 1 1 按钮 2 1 2 滑动条 2 1 3 文本框 2 1 4 单选框和复选框和切换按钮 2 1 5 弹出式菜单和列表框 2 1 6 按钮组 2 1 7 菜单编辑器 常见
  • 基于Xml方式Bean的配置-beanName个别名配置

    SpringBean配置详解 Bean的基础配置 例如前文涉及到的配置文件
  • 深入解读SpringBoot是什么?它到底有什么用?

    现在Spring Boot 非常火 各种技术文章 各种付费教程 多如牛毛 可能还有些不知道 Spring Boot 的 那它到底是什么呢 有什么用 今天给大家详细介绍一下 SpringBoot相关的教程 我是跟着动力节点王鹤老师讲的spri
  • Selenium Web自动化基础

    1 selenium环境配置 selenium是一个python的开源库 使用pip就可以安装 直接在cmd或者pycharm的终端执行pip install selenium 即可完成selenium库的安装 如果出现以下 Error c
  • 跟着angularjs2官方文档学习(四)

  • MySQL的复制原理以及流程,读写分离有哪些解决方案?

    MySQL的复制原理以及流程 主从复制 将主数据库中的DDL和DML操作通过二进制日志 BINLOG 传输到从数据库上 然后将这些日志重新执行 重做 从而使得从数据库的数据与主数据库保持一致 主从复制的作用 主数据库出现问题 可以切换到从数
  • 安卓手机格式化怎么弄_安卓手机怎样进入格式化?

    展开全部 硬格方法如下 在关机状态下 同时32313133353236313431303231363533e58685e5aeb931333365646261按住开机键和侧音量键下键 以开启手机 长按侧音量键下键约15秒钟 直至手机屏幕显示
  • shell脚本实现for循环打印数组

    array beijing tianjin hebei echo array 0 for i 0 i lt array i do echo array i done 数组要用括号加空格的方式进行声明 利用 或 可以将数组扩展成列表 然后使用
  • 电子产品量产工具项目开发中遇到的问题(更新......)

    1 找不到tslib h库的头文件 这是因为找不到tslib库的头文件 确定工具链中头文件 库文件目录 对于 IMX6ULL 命令如下 echo main arm linux gnueabihf gcc E v 找到了编译器arm linu
  • Python数据分析之pandas学习

    Python中的pandas模块进行数据分析 接下来pandas介绍中将学习到如下8块内容 1 数据结构简介 DataFrame和Series 2 数据索引index 3 利用pandas查询数据 4 利用pandas的DataFrames
  • 记一次win10+VM16双机调试的经历

    折腾了两天 终于成功 基础配置 宿主机和客户机均为win10 虚拟机是vm16 一 宿主机中的虚拟机配置 1 打开设置 删除打印机 也可以不删 网上很多教程 2 点击添加 选择串行端口 确定 3 选择2中添加的串行端口 选择 使用命名管道
  • CSS cubic-bezier() 函数 贝塞尔曲线 动画

    https www runoob com cssref func cubic bezier html
  • Jgit基础教程(Java调用git)

    前言 最近公司需要做一个java调用git的工具 这里简单的介绍了一下基本操作方法以及一些衍生的信息获取 或有不对的地方请大家批评指正 转载请注明出处 一 Jgit依赖导入