bash java run call git java call git interface
背景
其实也没有什么背景,就是想用java操作git上的项目来实现一些小功能,略过略过。
文章目录
- 背景
- 二、使用步骤
- 开发环境
- 框架环境
- 1.添加依赖
- 2.编写demo
- 遇到的问题
- 问题总结
二、使用步骤
我是参考 java 使用jgit 操作 git 来搭建的,最终遇到了一些报错,所以博客终归只是一个参考,需要自己去上手实现,好了,废话不多说,看下面步骤
开发环境
- maven3.6+
- git任意版本
- idea 2018.x+
框架环境
- springboot 2.x+
- jgit 5.9.0.202009080501-r
- java-gitlab-api 4.1.1
1.添加依赖
我这里是依赖的eclipse提供的jgit
<!-- jgit -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>${jgit.version}</version>
</dependency>
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.编写demo
- 写一个git的工具类
public class GitUtils {
public static CredentialsProvider connect(String email, String password, String apiToken){
UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider(email, password);
return provider;
}
@SneakyThrows
public static boolean cloneProject(String gitUrl){
String property = System.getProperty("user.home");
String baseName = FilenameUtils.getBaseName(gitUrl);
StringBuilder build = new StringBuilder(property).append(File.separator).append(baseName);
if (Files.exists(Paths.get(build.toString()))) {
Files.delete(Paths.get(build.toString()));
}
Files.createDirectories(Paths.get(build.toString()));
//git提供的api来clone项目
Git call = Git.cloneRepository().setURI(gitUrl)
.setCloneAllBranches(true)
.setDirectory(new File(build.toString()))
.call();
List<Ref> branchs = call.branchList().call();
//打印它的所有分支
System.out.println(branchs);
return false;
}
public static void main(String[] args) {
cloneProject("git@gitee.com:choviwu/qywechat.git");
}
}
写到这里您可能就开始跑main方法了,结果发现报错了,这都是在预料之中的,好了,看下面↓
遇到的问题
很多博客都没有依赖 org.eclipse.jgit.ssh.jsch依赖,这是因为我搭建的时候遇到了一个报错,并google了一下,得出了答案
Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: git@gitee.com:choviwu/qywechat.git: remote hung up unexpectedly
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:222)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:302)
...
这是eclipse公司的bug: 原地址这事实上已经在5.8+修复了,
事实上,今年八月份就有人提了这个bug了,然后作者托马斯回复说你这个代码是不是有包含org.eclipse.jgit.ssh.jsch 或者 org.eclipse.jgit.ssh.apache包,然后又回复了一句让你去看jgit的5.8版的更新日志然后我们去他老人家给的链接去看看
于是,去maven下搜会得到下面的结果:
可以看到,在文章发布的前两天他还发布了一个版本
于是去加入这个依赖
<!-- ssh链接git的 -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.ssh.jsch</artifactId>
<version>${jgit.version}</version>
</dependency>
问题总结
在接jgit的时候搜了很多资料(百度),发现博客上的资料千篇一律,大家都文(抄)采(来)飞(抄)扬(去),没有可以参考的资料,看源码太费时间,因此去google了一下,才看到ecplise官网提到了这个fixed,因此,不要太过于相信网上的博客,博客上大家写(拷)的也许是几年前的产物,如果用新的版本遇到的坑大家都得自己去规避,最有效的办法就是自己去翻源码(当然每个人能力不一),就比如jgit的源码用到了不少设计模式,不得不说ecplise公司对代码的要求还是挺高,也可能是国外程序员加班少,没有“福报”…… 好了,这里就踩坑踩到这里,后面有的再加上!
项目地址: 项目地址
上一篇: JGit 简介和使用