java操作git简单实现
记录瞬间
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand;
import org.eclipse.jgit.api.errors.*;
import org.eclipse.jgit.lib.BranchTrackingStatus;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* Git操作工具类
*/
public class JGitUtil {
private static String MODULE_NAME;
private static String BRANCH_NAME;
private static String GIT_USERNAME;
private static String GIT_PASSWORD;
private static String CHECK_BRANCH;
private static String REVISION;
private static String LOCAL_REPOGIT_CONFIG; final static Logger LOG = LoggerFactory.getLogger(JGitUtil.class); public JGitUtil(GitInfo gitInfo){
String[] gitPath = gitInfo.getGitUrl().split("/");
this.MODULE_NAME = "/" + gitPath[gitPath.length - 3] + "/" + gitPath[gitPath.length - 2]
+ "/" + gitPath[gitPath.length - 1];
this.BRANCH_NAME = gitInfo.getGitUrl();
this.GIT_PASSWORD = gitInfo.getGitPass();
this.GIT_USERNAME = gitInfo.getGitName();
this.CHECK_BRANCH = gitInfo.getGitBranch();
this.REVISION = gitInfo.getNewVersion();
this.LOCAL_REPOGIT_CONFIG = "./" + this.GIT_USERNAME + "/" + this.MODULE_NAME + "/.git";
}
/**
* 拉取远程代码
*
* @return 远程分支名
*/
public static boolean pull() {
return pull(BRANCH_NAME);
} public static boolean pull(String remoteBranchName) { boolean pullFlag = true;
UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider(
GIT_USERNAME, GIT_PASSWORD);
LOG.info(BRANCH_NAME);
String getCodeDir = BRANCH_NAME.split("/git/")[1];
File dir = new File("./" + GIT_USERNAME + "/" + getCodeDir);
if(dir.exists()){
deleteFolder(dir);
} try {
@SuppressWarnings("unused")
Git git = Git.cloneRepository().setURI(remoteBranchName)
.setDirectory(dir).setCredentialsProvider(provider).call();
List<Ref> call = git.branchList().call();
Repository repository = git.getRepository();
for (Ref ref : call) {
List<Integer> counts = getCounts(repository, ref.getName());
System.out.println("For branch: " + ref.getName());
System.out.println("Commits ahead : " + counts.get(0));
System.out.println("Commits behind : " + counts.get(1));
System.out.println();
}
} catch (org.eclipse.jgit.api.errors.TransportException e){
e.printStackTrace();
pullFlag = false;
} catch (Exception e) {
e.printStackTrace();
pullFlag = false;
}
return pullFlag;
} private static List<Integer> getCounts(Repository repository, String branchName) throws IOException {
BranchTrackingStatus trackingStatus = BranchTrackingStatus.of(repository, branchName);
List<Integer> counts = new ArrayList<>();
if (trackingStatus != null) {
counts.add(trackingStatus.getAheadCount());
counts.add(trackingStatus.getBehindCount());
} else {
System.out.println("Returned null, likely no remote tracking of branch " + branchName);
counts.add(0);
counts.add(0);
}
return counts;
} private static void deleteFolder(File file){
try {
if (file.isFile() || file.list().length==0) {
file.delete();
} else {
File[] files = file.listFiles();
for (File getFile: files) {
deleteFolder(getFile);
getFile.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 检出代码
* @param branchName
* @return
*/
public static boolean checkoutBranch(String branchName){
boolean checkoutFlag=true; if (branchName.equals("master")) {
return checkoutFlag;
} try ( Git git = Git.open( new File(LOCAL_REPOGIT_CONFIG) );) {
git.checkout().setName("origin/" + branchName).setForce(true).call();
//列出所有的分支名称
List<Ref> ll = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
for (Ref ref : ll){
System.out.println(ref.getName());
}
System.out.println("检出分支代码 success! ->" + branchName);
} catch (Exception e) {
e.printStackTrace();
checkoutFlag = false;
System.out.println("检出分支代码 failed ! ->" + branchName); }
return checkoutFlag;
}
/**
* 检出代码
* @param revision
* @return
*/
public static boolean checkoutRevision(String revision){
boolean checkoutFlag=true;
if (revision == null || revision.length() == 0) {
return checkoutFlag;
}
try ( Git git = Git.open( new File(LOCAL_REPOGIT_CONFIG) );) {
git.checkout().setName( revision ).setForce(true).call();
System.out.println("检出代码版本 success! ->" + revision);
} catch (Exception e) {
e.printStackTrace();
System.out.println("检出代码版本 failed ! ->" + revision);
checkoutFlag = false;
}
return checkoutFlag;
}
}
代码主要记录了,操作git检出代码,切换分支,切换版本。
*简洁可运行版本*
import java.io.File;
import java.util.List; import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; public class GitFromXLY { public static void main(String[] args) {
String baseUrl = "http://git/url";
String module = args[0];
String user = "username";
String pass = "password";
String branch = args[1];
String revision = args[2]; GitFromXLY gfxly = new GitFromXLY(module, user, pass, branch, revision); int getPullCode = gfxly.pull(baseUrl + module);
if (getPullCode == 0) {
System.out.println("检出代码成功===0");
} else if (getPullCode == 1) {
System.exit(1);
} else if (getPullCode == 2) {
System.exit(2);
} else if (getPullCode == 3) {
System.exit(3);
} else if (getPullCode == 4) {
System.exit(4);
} else {
System.out.println("检出代码未知异常===5");
System.exit(5);
}
int getBranchCode = gfxly.checkoutBranch();
if (getBranchCode == 0) {
System.out.println("检出分支成功===0");
} else if (getPullCode == 6) {
System.exit(6);
} else {
System.out.println("检出分支未知异常===7");
System.exit(7);
}
int getRevisionCode = gfxly.checkoutRevision();
if (getRevisionCode == 0) {
System.out.println("检出版本成功===0");
} else if (getPullCode == 8) {
System.exit(8);
} else {
System.out.println("检出版本未知异常===9");
System.exit(9);
}
} private String module;
private String user;
private String pass;
private String branch;
private String revision;
private String git_config; public GitFromXLY(String module, String user, String pass, String branch, String revision){
this.module = module;
this.user = user;
this.pass = pass;
this.branch = branch;
this.revision = revision;
this.git_config = "./basedir/" + module + "/.git";
} /**
* 通过url拉取代码
* @param gitUrl
* @return
*/
public int pull(String gitUrl){
String pullMsg = "";
// 标记拉取代码的标志
int pullFlag = 0;
// 提供用户名和密码的验证
UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider(
this.user, this.pass);
// 指定要加载的代码路径
File dir = new File("./basedir/" + this.module);
// 判断代码路径下是否有内容,如果有就删除
if(dir.exists()){
deleteFolder(dir);
} Git git = null;
try {
git = Git.cloneRepository().setURI(gitUrl)
.setDirectory(dir).setCredentialsProvider(provider).call();
pullMsg = "检出代码成功 success";
} catch (org.eclipse.jgit.api.errors.TransportException e){
e.printStackTrace();
pullMsg = "用户名NAME或密码PASSWORD错误或远程链接URL错误 failed";
pullFlag = 1;
} catch (org.eclipse.jgit.api.errors.JGitInternalException e) {
e.printStackTrace();
pullMsg = "已经存在了项目的下载目录,并且目录正在被操作 failed";
pullFlag = 2;
} catch (GitAPIException e) {
e.printStackTrace();
pullMsg = "调用GitAPI异常,failed";
pullFlag = 3;
} catch (NoClassDefFoundError e) {
e.printStackTrace();
pullMsg = "未找到相应的类文件异常,failed";
pullFlag = 4;
} finally {
System.out.println(pullMsg +"--code--"+ pullFlag);
if (git != null) {
git.close();
}
} return pullFlag;
}
/**
* 检出分支
* @param branchName
* @return
*/
public int checkoutBranch(){
String checkoutMsg = "";
int checkoutFlag = 0; if (this.branch.equals("master")) {
checkoutMsg = "Check out code OK. ->" + this.branch;
System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
return checkoutFlag;
}
Git git = null;
try {
git = Git.open( new File(this.git_config) );
//列出所有的分支名称
List<Ref> branchList = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
for (Ref ref : branchList){
if (this.branch.equals(ref.getName())) {
System.out.println("代码分支列表中存在给定分支");
}
}
git.checkout().setName("origin/" + this.branch).setForce(true).call();
checkoutMsg = "检出分支代码 success! code OK ->" + this.branch;
} catch (Exception e) {
e.printStackTrace();
checkoutMsg = "检出分支代码 failed ! ->" + this.branch;
checkoutFlag = 6;
} finally {
System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
if (git != null) {
git.close();
}
} return checkoutFlag;
}
/**
* 检出代码
* @param revision
* @return
*/
public int checkoutRevision(){
String checkoutMsg = "";
int checkoutFlag = 0;
if (this.revision == null || this.revision.length() == 0) {
checkoutMsg = "Check out code OK. ->" + this.revision;
System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
return checkoutFlag;
}
Git git = null;
try {
git = Git.open( new File(this.git_config) );
git.checkout().setName( this.revision ).setForce(true).call();
checkoutMsg = "检出代码版本 success! code OK. ->" + this.revision;
} catch (Exception e) {
e.printStackTrace();
checkoutMsg = "检出代码版本 failed ! ->" + this.revision;
checkoutFlag = 8;
} finally {
System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
if (git != null) {
git.close();
}
}
return checkoutFlag;
}
/**
* 删除目录
* @param file
*/
private void deleteFolder(File file){
try {
if (file.isFile() || file.list().length==0) {
file.delete();
} else {
File[] files = file.listFiles();
for (File getFile: files) {
deleteFolder(getFile);
getFile.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
} }
依赖包如下:

===========================================
java操作git简单实现的更多相关文章
- Java操作redis简单示例
第一:安装Redis 首先我们要安装Redis,就像我们操作数据库一样,在操作之前肯定要先创建好数据库的环境. Redis的下载可以百度一下,或者打开下面的下载链接: https:/ ...
- java操作redis之jedis篇
首先来简单介绍一下jedis,其实一句话就可以概括的,就是java操作redis的一种api.我们知道redis提供了基本上所有常用编程语言的clients,大家可以到http://redis.io/ ...
- 关于操作git
手册:http://www.yiibai.com/git/ 一.安装git,可以通过git bash执行命令行:安装tortoiseGit执行git相关操作,在那之前需要了解下git命令行操作 二.在 ...
- 小丁带你走进git世界一-git简单配置
小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config –global user.name BattleHeaer ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- JAVA操作MongoDB数据库
1. 首先,下载MongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.Java操作Mo ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Java操作Session与Cookie
1,Java操作Session Java操作Session非常简单,步骤如下 1.1,在servlet中通过request获取session HttpSession session = request ...
- 使用webstorm操作git
0. 前言 在上一篇文章中,讲述了使用webstorm去调试node程序,最近研究了一下如何使用webstorm去操作git. 对于git的使用,大家的使用方式均有不同,最王道的方式非命令行莫属,基于 ...
随机推荐
- Laravel 5 中间件、路由群组、子域名路由、 权限控制的基本使用方法
创建控制器: php artisan make:controller Admin/IndexController 创建Middleware: php artisan make:middleware T ...
- macOS上实现Qt应用程序做文件关联打开
一.背景介绍 用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现.Windows应用程序在安装的时候可以在注册表中写入相关的键值对.打开文件的时 ...
- python 的 virtualenv 环境搭建及 sublime 手动创建运行环境
一.安装 virtual env sudo pip install virtualenv二.进入一个空白的目录初始化 virtual env 的环境cd ~/workspace/python/virt ...
- 杭电1532----Drainage Ditches『最大流』
/* 网络流的最大流问题 刚学习Dinic算法.模版题 */ #include <cstring> #include <cstdio> #include <queue&g ...
- C#超简单自定义事件
我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行: using System; using System.Collections.Generic; ...
- jquery第二篇
1 操作元素(属性,css,文档处理) --------------------------属性 $("").attr(); $("").removeAttr ...
- GMA Round 1 最短距离
传送门 最短距离 在椭圆C:$\frac{x^2}{20^2}+\frac{y^2}{18^2}=1$上作两条相互垂直的切线,切线交点为P,求P到椭圆C的最短距离.结果保留6位小数. 设椭圆方程:$\ ...
- __x__(31)0908第五天__导航条的练习 <ul> 版本
效果图: html代码: <!doctype html> <html> <head> <meta charset="utf-8" /&g ...
- css学习_css3伸缩布局 flex布局
1.flex布局 案例一: 案例二: 保证不至于缩放得太小或太大 案例三:flex的值不一定要写成几份,可以写成固定值 案例四: 竖着3等分(父容器按照高度3等分) !!案例 -----用fle ...
- js常用正则表达式判断
1.判断IP:端口 <html> <head> </head> <body> ip:port<input type="" na ...