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 =