记录瞬间

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简单实现的更多相关文章

  1. Java操作redis简单示例

    第一:安装Redis    首先我们要安装Redis,就像我们操作数据库一样,在操作之前肯定要先创建好数据库的环境.    Redis的下载可以百度一下,或者打开下面的下载链接:    https:/ ...

  2. java操作redis之jedis篇

    首先来简单介绍一下jedis,其实一句话就可以概括的,就是java操作redis的一种api.我们知道redis提供了基本上所有常用编程语言的clients,大家可以到http://redis.io/ ...

  3. 关于操作git

    手册:http://www.yiibai.com/git/ 一.安装git,可以通过git bash执行命令行:安装tortoiseGit执行git相关操作,在那之前需要了解下git命令行操作 二.在 ...

  4. 小丁带你走进git世界一-git简单配置

    小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config  –global user.name BattleHeaer ...

  5. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  6. JAVA操作MongoDB数据库

    1. 首先,下载MongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.Java操作Mo ...

  7. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  8. Java操作Session与Cookie

    1,Java操作Session Java操作Session非常简单,步骤如下 1.1,在servlet中通过request获取session HttpSession session = request ...

  9. 使用webstorm操作git

    0. 前言 在上一篇文章中,讲述了使用webstorm去调试node程序,最近研究了一下如何使用webstorm去操作git. 对于git的使用,大家的使用方式均有不同,最王道的方式非命令行莫属,基于 ...

随机推荐

  1. 【转】【数据结构】【有n个元素依次进栈,则出栈序列有多少种】

    卡特兰数 大神解释:https://blog.csdn.net/akenseren/article/details/82149145      权侵删 原题 有一个容量足够大的栈,n个元素以一定的顺序 ...

  2. 第二篇flask响应方式

    响应三件套 1.Flask中的HTTPResponse @app.route('/home') # app中的route装饰器 def home(): # 视图 return '登陆成功' #HTTP ...

  3. python3.7 打包成exe程序(只需两行命令)

    根据博客作者louniuous的python3.7 打包成exe的一种方法 pyinstaller一文改编简化 环境:pycharm2018.1+win7+python3.7 工具:pyinstall ...

  4. LCA的在线与离线算法

    在线:链接 离线:链接

  5. URL 链接中 井号#、问号?、连接符& 分别有什么作用?

    在一个 URL 中可以包含很多的内容,其中不仅仅是包含 26 个英文字母,10 个罗马数字,中文汉字,还可以拥有井号“#”.问号“?”.连接符“&”等三种最常见的符号,那么这些符号在网站中都有 ...

  6. EL表达式与标签的使用

  7. idea使用配置

    一,打开窗口多行显示, Window→Editor Tabs→Tabs Placement→Show Tabs in Single Row 取消选中后即可在多行显示 2 .还可以自行设置打开文件窗口数 ...

  8. js之promise讲解

    1 Promise概述 Promise对象是CommonJS工作组提出的一种规范,目的是为异步操作提供统一接口. 那么,什么是Promises? 首先,它是一个对象,也就是说与其他JavaScript ...

  9. js获取手机信息

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. php的Memcached模块扩展

    Memcached模块介绍       Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态. ...