Java通过JGit操作Git的使用方法

by zhimaxingzhe from Java通过JGit操作Git的使用方法 欢迎分享链接,转载请注明出处,尊重版权,若急用请联系授权。 https://zhimaxingzhe.github.io

前言

Java 社区操作与GIT交互的最好组件应该就是JGit了,目前没找到更好的,JGit是实现Git版本控制系统的纯Java库。 这是一个Eclipse项目,最初是EGit的Git库,它提供了与Eclipse的Git集成。 同时,JGit还有更多采用者,例如Gerrit,GitBlit,Jenkins的GitClient插件。近期在做配置文件发布功能时用到了,学习了JGit的使用,做一下分享。若有助益,请一键三连吧🤝。

在这里插入图片描述

与GIT交互如何做?最早我想通过在服务器上安装git客户端,在Java代码中执行shell命令的方式来实现对git的操作,这样一来非常灵活,代码都写好了(见文末)。但这样与GIT交互开发、调试工作量巨大,且部署需要运维做较多工作,且存在安全问题,对权限的控制要求严格。
后来找到JGit,了解到JGit 可以不依赖服务器安装 git client 即可对 GIT 进行操作,而且对GIT的绝大部分操作都封装好了API,真是太适合我的场景了。

一、导入依赖

当前最新的版本是6.4.0版本,而且是JDK 11编译版本,要求JDK 是11及其以上版本才行,如果是JDK 8 得找旧版本的,比如5.13版本,可能有漏洞风险,要视情况来使用。截稿前5.13版本没看到有漏洞风险,可以使用。

<dependency>
    <groupId>org.eclipse.JGit</groupId>
    <artifactId>org.eclipse.JGit</artifactId>
    <version>6.4.0.202210260700-m2</version>
</dependency>

<dependency>
    <groupId>org.eclipse.JGit</groupId>
    <artifactId>org.eclipse.JGit</artifactId>
    <version>5.13.1.202206130422-r</version>
</dependency>

二、基础操作

1、创建仓库推送到远程

本地已存在目录初始化为仓库后推送到远程

cd "/Users/zhimaxingzhe/test"
git init
git remote add origin https://github.com/zhimaxingzhe/test.git
git add .
git commit -m "init"
git push -u origin master
// 初始化本地仓库,标记远程仓库地址 "https://github.com/zhimaxingzhe/test.git"
Git git = Git.init().setDirectory(new File("/Users/zhimaxingzhe/test")).call();
StoredConfig config = git.getRepository().getConfig();
config.setString("remote", "origin", "url", "https://github.com/zhimaxingzhe/test.git");
config.save();
git.commit().setMessage("init").call();
//推到远程仓库
UsernamePasswordCredentialsProvider provider =
                    new UsernamePasswordCredentialsProvider("userName-zhimaxingzhe", password);
git.push().setRemote("origin").setCredentialsProvider(provider)
                    .setRefSpecs(new RefSpec("master")).call();

远程已存在的仓库

git clone https://github.com/zhimaxingzhe/test.git
cd test
touch README.md
git add README.md
git commit -m 'add README.md'
git push -u origin master

对应的,通过JGit是如何操作的呢?直接上代码

// 克隆远程仓库到本地
Git git = Git.cloneRepository().setURI("https://github.com/zhimaxingzhe/test.git").setTimeout(90)
                .setDirectory(new File("/Users/zhimaxingzhe/test"))
                .setCredentialsProvider(provider).call();
// 创建本地文件
FileUtil.touch("/Users/zhimaxingzhe/test"+ "/README.md");
//添加全部文件
git.add().addFilepattern("README.md").call(); 
//提交
git.commit().setMessage("add README").call();
//推到远程仓库
UsernamePasswordCredentialsProvider provider =
                    new UsernamePasswordCredentialsProvider("userName-zhimaxingzhe", password);
git.push().setRemote("origin").setCredentialsProvider(provider)
                    .setRefSpecs(new RefSpec("master")).call();

2、 clone 远端仓库到本地

// 提供用户名和密码的验证
UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName", "password");
// 判断本地目录是否存在
boolean exist = FileUtil.exist("/Users/zhimaxingzhe/");
if (!exist) {
   
    FileUtil.mkdir("/Users/zhimaxingzhe/");
}
// clone 仓库到指定目录
Git git = Git.cloneRepository().setURI(GIT_URL).setDirectory(new File("/Users/zhimaxingzhe/test"))
        .setCredentialsProvider(provider).call();

3、身份认证

上面的例子中都有用到用户名密码做身份验证,所以顺着讲一下身份认证。在做远程仓库操作是需要身份认证,如执行pull、push、clone操作时。和git交互一样,身份认证JGit 支持两种方式,一种是HTTP(S)账号+密码的方式,一种是通过SSH协议使用公钥认证。
HTTP(S)账号+密码:

// 账号 + 密码
UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName-zhimaxingzhe", password);
// 拉取远程更新        
git.pull().setCredentialsProvider(provider).setRemoteBranchName(branchName).call();

SSH协议使用公钥认证:

SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
   
    @Override
    protected void configure(OpenSshConfig.Host host, Session session) {
   
        session.setConfig("StrictHostKeyChecking", "no");
    }

    @Override
    protected JSch createDefaultJSch(FS fs) throws JSchException {
   
        JSch sch = 
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值