JAVA 使用jgit管理git仓库

最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下。

JGit是一款pure java的软件包,可以读写git仓库,下面介绍基本使用。

引入jgit

maven引入:

org.eclipse.jgit

org.eclipse.jgit

5.6.0.201912101111-r

jgit 有一个Git类,可以用来执行常规的git操作

凭证管理

通过CredentialsProvider管理凭证,常用的是UsernamePasswordCredentialsProvider

通过下面代码初始化:

public static CredentialsProvider createCredential(String userName, String password) {

return new UsernamePasswordCredentialsProvider(userName, password);

}

clone远程仓库

git 命令:

git clone {repoUrl}

通过Git.cloneRepository 来clone远程仓库,如果需要凭证,则需要指定credentialsProvider

public static Git fromCloneRepository(String repoUrl, String cloneDir, CredentialsProvider provider) throws GitAPIException{

Git git = Git.cloneRepository()

.setCredentialsProvider(provider)

.setURI(repoUrl)

.setDirectory(new File(cloneDir)).call();

return git;

}

commit

git 命令:

git commit -a -m '{msg}'

commit比较简单,对应commit方法, 注意需要先add

public static void commit(Git git, String message, CredentialsProvider provider) throws GitAPIException {

git.add().addFilepattern(".").call();

git.commit()

.setMessage(message)

.call();

}

push

git 命令:

git push origin branchName

push直接调用push即可, 需要指定credentialsProvider

public static void push(Git git, CredentialsProvider provider) throws GitAPIException, IOException{

push(git,null,provider);

}

public static void push(Git git, String branch, CredentialsProvider provider) throws GitAPIException, IOException{

if (branch == null) {

branch = git.getRepository().getBranch();

}

git.push()

.setCredentialsProvider(provider)

.setRemote("origin").setRefSpecs(new RefSpec(branch)).call();

}

读取已有仓库

如果git已经clone了,想直接读取,怎么办?

public static Repository getRepositoryFromDir(String dir) throws IOException{

return new FileRepositoryBuilder()

.setGitDir(Paths.get(dir, ".git").toFile())

.build();

}

读取仓库日志

可以通过RevWalk读取仓库日志。

revWalk.parseCommit 可读取一条commit

遍历revWalk,可读取所有日志

public static List getLogs(Repository repository) throws IOException{

return getLogsSinceCommit(repository, null, null);

}

public static List getLogsSinceCommit(Repository repository, String commit) throws IOException{

return getLogsSinceCommit(repository, null, commit);

}

public static List getLogsSinceCommit(Repository repository, String branch, String commit) throws IOException{

if (branch == null) {

branch = repository.getBranch();

}

Ref head = repository.findRef("refs/heads/" + branch);

List commits = new ArrayList<>();

if (head != null) {

try (RevWalk revWalk = new RevWalk(repository)) {

revWalk.markStart(revWalk.parseCommit(head.getObjectId()));

for (RevCommit revCommit : revWalk) {

if (revCommit.getId().getName().equals(commit)) {

break;

}

commits.add(revCommit.getFullMessage());

System.out.println("\nCommit-Message: " + revCommit.getFullMessage());

}

revWalk.dispose();

}

}

return commits;

}

测试

我们来先clone仓库,然后修改,最后push

String yaml = "dependencies:\n" +

"- name: springboot-rest-demo\n" +

" version: 0.0.5\n" +

" repository: http://hub.hubHOST.com/chartrepo/ainote\n" +

" alias: demo\n" +

"- name: exposecontroller\n" +

" version: 2.3.82\n" +

" repository: http://chartmuseum.jenkins-x.io\n" +

" alias: cleanup\n";

CredentialsProvider provider = createCredential("USR_NAME", "PASSWORD");

String cloneDir = "/tmp/test";

Git git = fromCloneRepository("http://gitlab.GITHOST.cn/datahub/env-test.git", cloneDir, provider);

// 修改文件

FileUtils.writeStringToFile(Paths.get(cloneDir, "env", "requirements.yaml").toFile(), yaml, "utf-8");

// 提交

commit(git, "deploy(app): deploy springboot-rest-demo:0.0.5 to env test", provider);

// push 到远程仓库

push(git, "master", provider);

git.clean().call();

git.close();

FileUtils.deleteDirectory(new File(cloneDir));

读取已有仓库的日志:

Repository repository = getRepositoryFromDir("GIT_DIR");

List logs = getLogs(repository);

System.out.println(logs);

RevCommit head = getLastCommit(repository);

System.out.println(head.getFullMessage());

小结

本文讲述了如何通过jgit完成常规的git操作。

作者:Jadepeng

出处:jqpeng的技术记事本–http://www.cnblogs.com/xiaoqi

jgit查询远程仓库_JAVA 使用jgit管理git仓库相关推荐

  1. svn的代码提交到git服务器_svn服务器代码仓库,数据迁移到git仓库

    svn服务器代码仓库,数据迁移到git仓库 1.安装svn [root@tomcat01 ~]# yum install subversion -y 2.初始化仓库 [root@tomcat02 ~] ...

  2. 从一个git仓库迁移到另外一个git仓库

    从一个git仓库迁移到另外一个git仓库 摘要  git仓库迁移 git 声明:相关内容是根据网络资料整理所得,仅供参考. 1). 从原地址克隆一份裸版本库,比如原本托管于 GitHub. git c ...

  3. Git使用(Git安装、建立Git仓库、克隆Git仓库、提交代码至Git仓库)

    目录 1 Git安装 2 建立Git仓库 3 克隆Git仓库 3.1 新建Spring Boot项目 ​3.2 克隆Git仓库 4 提交代码至Git仓库 4.1 Pull ​4.2 Commit 4. ...

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

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

  5. 搭建自己的git仓库之简单搭建本地git仓库和远程git仓库~

    一.安裝git 1.在https://git-scm.com/downloads下载安装git: 2.安装成功后在开始菜单中或任意一个文件夹中点击鼠标右键打开git bash: 3.在命令行輸入:  ...

  6. Git仓库瘦身--清除项目git仓库大文件

      Mark一下"清除A项目git仓库大文件"实操过程,由于公司保密政策,无法提供实操截图,这里提供下操作思路. 后来也搜到更加推荐的方法:用BFG去做git仓库的清理(最佳工具) ...

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

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

  8. 从一个git仓库拷贝到另一个git仓库

    利用git从一个仓库拷贝一个项目到另一个仓库,并且log也能够一起过去. 1.从原地址克隆一份裸版本库,比如原本托管于 GitHub. git clone --bare http://github.. ...

  9. Git使用-从一个git仓库迁移到另外一个git仓库

    1). 从原地址克隆一份裸版本库,比如原本托管于 GitHub.git clone --bare git://github.com/username/project.git –bare 创建的克隆版本 ...

最新文章

  1. 谈谈UI架构设计的演化
  2. jbpm4.4基础知识
  3. htmlcss实例小项目_HTMLCSS学习笔记(十九)-- 媒体查询
  4. 职业标准体系一般有几个层次划分_全国首个粤菜标准体系规划发布
  5. tensorflow中的正则化解决过拟合问题
  6. 如何修改pjsip默认的c++依赖库版本
  7. java之socket的OOBInline和UrgentData和发送心跳包研究
  8. nginx总结(面试必看)
  9. Android笔记 简单demo Spinner AutoCompleteTextView Menu
  10. docker run 与docker start的区别
  11. 算法_深度LSTM笔记[博]
  12. 农广传媒获中体基金2000万元Pre-A轮融资
  13. SQL Server-【知识与实战VIII】触发器(下)
  14. 微信禁止模拟器登录怎么办?
  15. 学校计算机机房解说词,学校会议室解说词.doc
  16. CENTOS下firefox看视频缺少flash插件
  17. IMX6ULL裸机开发之点亮LED灯
  18. CF1774C. Ice and Fire
  19. MemSQL分布式架构介绍
  20. VSCode安装和使用教程

热门文章

  1. 堵住大数据“窃密通道”刻不容缓
  2. 【JDK7】新特性(2) 语法
  3. 对于学习方式的一些思考
  4. java 枚举转byte_如何在java中将一个枚举转换为另一个枚举?
  5. XMT.com超200万被区块链终端交易
  6. 初创企业购买企业邮箱_支持#NetNeutrality =支持设计师及其创建的初创企业
  7. 使用Tape和Vue Test Utils编写快速的Vue单元测试
  8. nginx+tomcat+memcache实现负载均衡、session共享
  9. 数据通信技术(十:OSPF特殊区域TOTALLY STUB配置(ZTE))
  10. html中的两种标记,如何在html选项标记中实现两种不同的对齐?