记录瞬间

  1. import org.eclipse.jgit.api.Git;
  2. import org.eclipse.jgit.api.ListBranchCommand;
  3. import org.eclipse.jgit.api.errors.*;
  4. import org.eclipse.jgit.lib.BranchTrackingStatus;
  5. import org.eclipse.jgit.lib.Ref;
  6. import org.eclipse.jgit.lib.Repository;
  7. import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10.  
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15.  
  16. /**
  17. * Git操作工具类
  18. */
  19. public class JGitUtil {
  20. private static String MODULE_NAME;
  21. private static String BRANCH_NAME;
  22. private static String GIT_USERNAME;
  23. private static String GIT_PASSWORD;
  24. private static String CHECK_BRANCH;
  25. private static String REVISION;
  26. private static String LOCAL_REPOGIT_CONFIG;
  27.  
  28. final static Logger LOG = LoggerFactory.getLogger(JGitUtil.class);
  29.  
  30. public JGitUtil(GitInfo gitInfo){
  31. String[] gitPath = gitInfo.getGitUrl().split("/");
  32. this.MODULE_NAME = "/" + gitPath[gitPath.length - 3] + "/" + gitPath[gitPath.length - 2]
  33. + "/" + gitPath[gitPath.length - 1];
  34. this.BRANCH_NAME = gitInfo.getGitUrl();
  35. this.GIT_PASSWORD = gitInfo.getGitPass();
  36. this.GIT_USERNAME = gitInfo.getGitName();
  37. this.CHECK_BRANCH = gitInfo.getGitBranch();
  38. this.REVISION = gitInfo.getNewVersion();
  39. this.LOCAL_REPOGIT_CONFIG = "./" + this.GIT_USERNAME + "/" + this.MODULE_NAME + "/.git";
  40. }
  41. /**
  42. * 拉取远程代码
  43. *
  44. * @return 远程分支名
  45. */
  46. public static boolean pull() {
  47. return pull(BRANCH_NAME);
  48. }
  49.  
  50. public static boolean pull(String remoteBranchName) {
  51.  
  52. boolean pullFlag = true;
  53. UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider(
  54. GIT_USERNAME, GIT_PASSWORD);
  55. LOG.info(BRANCH_NAME);
  56. String getCodeDir = BRANCH_NAME.split("/git/")[1];
  57. File dir = new File("./" + GIT_USERNAME + "/" + getCodeDir);
  58. if(dir.exists()){
  59. deleteFolder(dir);
  60. }
  61.  
  62. try {
  63. @SuppressWarnings("unused")
  64. Git git = Git.cloneRepository().setURI(remoteBranchName)
  65. .setDirectory(dir).setCredentialsProvider(provider).call();
  66. List<Ref> call = git.branchList().call();
  67. Repository repository = git.getRepository();
  68. for (Ref ref : call) {
  69. List<Integer> counts = getCounts(repository, ref.getName());
  70. System.out.println("For branch: " + ref.getName());
  71. System.out.println("Commits ahead : " + counts.get(0));
  72. System.out.println("Commits behind : " + counts.get(1));
  73. System.out.println();
  74. }
  75. } catch (org.eclipse.jgit.api.errors.TransportException e){
  76. e.printStackTrace();
  77. pullFlag = false;
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. pullFlag = false;
  81. }
  82. return pullFlag;
  83. }
  84.  
  85. private static List<Integer> getCounts(Repository repository, String branchName) throws IOException {
  86. BranchTrackingStatus trackingStatus = BranchTrackingStatus.of(repository, branchName);
  87. List<Integer> counts = new ArrayList<>();
  88. if (trackingStatus != null) {
  89. counts.add(trackingStatus.getAheadCount());
  90. counts.add(trackingStatus.getBehindCount());
  91. } else {
  92. System.out.println("Returned null, likely no remote tracking of branch " + branchName);
  93. counts.add(0);
  94. counts.add(0);
  95. }
  96. return counts;
  97. }
  98.  
  99. private static void deleteFolder(File file){
  100. try {
  101. if (file.isFile() || file.list().length==0) {
  102. file.delete();
  103. } else {
  104. File[] files = file.listFiles();
  105. for (File getFile: files) {
  106. deleteFolder(getFile);
  107. getFile.delete();
  108. }
  109. }
  110. } catch (Exception e) {
  111. e.printStackTrace();
  112. }
  113. }
  114.  
  115. /**
  116. * 检出代码
  117. * @param branchName
  118. * @return
  119. */
  120. public static boolean checkoutBranch(String branchName){
  121. boolean checkoutFlag=true;
  122.  
  123. if (branchName.equals("master")) {
  124. return checkoutFlag;
  125. }
  126.  
  127. try ( Git git = Git.open( new File(LOCAL_REPOGIT_CONFIG) );) {
  128. git.checkout().setName("origin/" + branchName).setForce(true).call();
  129. //列出所有的分支名称
  130. List<Ref> ll = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
  131. for (Ref ref : ll){
  132. System.out.println(ref.getName());
  133. }
  134. System.out.println("检出分支代码 success! ->" + branchName);
  135. } catch (Exception e) {
  136. e.printStackTrace();
  137. checkoutFlag = false;
  138. System.out.println("检出分支代码 failed ! ->" + branchName);
  139.  
  140. }
  141. return checkoutFlag;
  142. }
  143. /**
  144. * 检出代码
  145. * @param revision
  146. * @return
  147. */
  148. public static boolean checkoutRevision(String revision){
  149. boolean checkoutFlag=true;
  150. if (revision == null || revision.length() == 0) {
  151. return checkoutFlag;
  152. }
  153. try ( Git git = Git.open( new File(LOCAL_REPOGIT_CONFIG) );) {
  154. git.checkout().setName( revision ).setForce(true).call();
  155. System.out.println("检出代码版本 success! ->" + revision);
  156. } catch (Exception e) {
  157. e.printStackTrace();
  158. System.out.println("检出代码版本 failed ! ->" + revision);
  159. checkoutFlag = false;
  160. }
  161. return checkoutFlag;
  162. }
    }

代码主要记录了,操作git检出代码,切换分支,切换版本。

*简洁可运行版本*

  1. import java.io.File;
  2. import java.util.List;
  3.  
  4. import org.eclipse.jgit.api.Git;
  5. import org.eclipse.jgit.api.ListBranchCommand;
  6. import org.eclipse.jgit.api.errors.GitAPIException;
  7. import org.eclipse.jgit.lib.Ref;
  8. import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
  9.  
  10. public class GitFromXLY {
  11.  
  12. public static void main(String[] args) {
  13. String baseUrl = "http://git/url";
  14. String module = args[0];
  15. String user = "username";
  16. String pass = "password";
  17. String branch = args[1];
  18. String revision = args[2];
  19.  
  20. GitFromXLY gfxly = new GitFromXLY(module, user, pass, branch, revision);
  21.  
  22. int getPullCode = gfxly.pull(baseUrl + module);
  23. if (getPullCode == 0) {
  24. System.out.println("检出代码成功===0");
  25. } else if (getPullCode == 1) {
  26. System.exit(1);
  27. } else if (getPullCode == 2) {
  28. System.exit(2);
  29. } else if (getPullCode == 3) {
  30. System.exit(3);
  31. } else if (getPullCode == 4) {
  32. System.exit(4);
  33. } else {
  34. System.out.println("检出代码未知异常===5");
  35. System.exit(5);
  36. }
  37. int getBranchCode = gfxly.checkoutBranch();
  38. if (getBranchCode == 0) {
  39. System.out.println("检出分支成功===0");
  40. } else if (getPullCode == 6) {
  41. System.exit(6);
  42. } else {
  43. System.out.println("检出分支未知异常===7");
  44. System.exit(7);
  45. }
  46. int getRevisionCode = gfxly.checkoutRevision();
  47. if (getRevisionCode == 0) {
  48. System.out.println("检出版本成功===0");
  49. } else if (getPullCode == 8) {
  50. System.exit(8);
  51. } else {
  52. System.out.println("检出版本未知异常===9");
  53. System.exit(9);
  54. }
  55. }
  56.  
  57. private String module;
  58. private String user;
  59. private String pass;
  60. private String branch;
  61. private String revision;
  62. private String git_config;
  63.  
  64. public GitFromXLY(String module, String user, String pass, String branch, String revision){
  65. this.module = module;
  66. this.user = user;
  67. this.pass = pass;
  68. this.branch = branch;
  69. this.revision = revision;
  70. this.git_config = "./basedir/" + module + "/.git";
  71. }
  72.  
  73. /**
  74. * 通过url拉取代码
  75. * @param gitUrl
  76. * @return
  77. */
  78. public int pull(String gitUrl){
  79. String pullMsg = "";
  80. // 标记拉取代码的标志
  81. int pullFlag = 0;
  82. // 提供用户名和密码的验证
  83. UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider(
  84. this.user, this.pass);
  85. // 指定要加载的代码路径
  86. File dir = new File("./basedir/" + this.module);
  87. // 判断代码路径下是否有内容,如果有就删除
  88. if(dir.exists()){
  89. deleteFolder(dir);
  90. }
  91.  
  92. Git git = null;
  93. try {
  94. git = Git.cloneRepository().setURI(gitUrl)
  95. .setDirectory(dir).setCredentialsProvider(provider).call();
  96. pullMsg = "检出代码成功 success";
  97. } catch (org.eclipse.jgit.api.errors.TransportException e){
  98. e.printStackTrace();
  99. pullMsg = "用户名NAME或密码PASSWORD错误或远程链接URL错误 failed";
  100. pullFlag = 1;
  101. } catch (org.eclipse.jgit.api.errors.JGitInternalException e) {
  102. e.printStackTrace();
  103. pullMsg = "已经存在了项目的下载目录,并且目录正在被操作 failed";
  104. pullFlag = 2;
  105. } catch (GitAPIException e) {
  106. e.printStackTrace();
  107. pullMsg = "调用GitAPI异常,failed";
  108. pullFlag = 3;
  109. } catch (NoClassDefFoundError e) {
  110. e.printStackTrace();
  111. pullMsg = "未找到相应的类文件异常,failed";
  112. pullFlag = 4;
  113. } finally {
  114. System.out.println(pullMsg +"--code--"+ pullFlag);
  115. if (git != null) {
  116. git.close();
  117. }
  118. }
  119.  
  120. return pullFlag;
  121. }
  122. /**
  123. * 检出分支
  124. * @param branchName
  125. * @return
  126. */
  127. public int checkoutBranch(){
  128. String checkoutMsg = "";
  129. int checkoutFlag = 0;
  130.  
  131. if (this.branch.equals("master")) {
  132. checkoutMsg = "Check out code OK. ->" + this.branch;
  133. System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
  134. return checkoutFlag;
  135. }
  136. Git git = null;
  137. try {
  138. git = Git.open( new File(this.git_config) );
  139. //列出所有的分支名称
  140. List<Ref> branchList = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
  141. for (Ref ref : branchList){
  142. if (this.branch.equals(ref.getName())) {
  143. System.out.println("代码分支列表中存在给定分支");
  144. }
  145. }
  146. git.checkout().setName("origin/" + this.branch).setForce(true).call();
  147. checkoutMsg = "检出分支代码 success! code OK ->" + this.branch;
  148. } catch (Exception e) {
  149. e.printStackTrace();
  150. checkoutMsg = "检出分支代码 failed ! ->" + this.branch;
  151. checkoutFlag = 6;
  152. } finally {
  153. System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
  154. if (git != null) {
  155. git.close();
  156. }
  157. }
  158.  
  159. return checkoutFlag;
  160. }
  161. /**
  162. * 检出代码
  163. * @param revision
  164. * @return
  165. */
  166. public int checkoutRevision(){
  167. String checkoutMsg = "";
  168. int checkoutFlag = 0;
  169. if (this.revision == null || this.revision.length() == 0) {
  170. checkoutMsg = "Check out code OK. ->" + this.revision;
  171. System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
  172. return checkoutFlag;
  173. }
  174. Git git = null;
  175. try {
  176. git = Git.open( new File(this.git_config) );
  177. git.checkout().setName( this.revision ).setForce(true).call();
  178. checkoutMsg = "检出代码版本 success! code OK. ->" + this.revision;
  179. } catch (Exception e) {
  180. e.printStackTrace();
  181. checkoutMsg = "检出代码版本 failed ! ->" + this.revision;
  182. checkoutFlag = 8;
  183. } finally {
  184. System.out.println(checkoutMsg +"--code--"+ checkoutFlag);
  185. if (git != null) {
  186. git.close();
  187. }
  188. }
  189. return checkoutFlag;
  190. }
  191. /**
  192. * 删除目录
  193. * @param file
  194. */
  195. private void deleteFolder(File file){
  196. try {
  197. if (file.isFile() || file.list().length==0) {
  198. file.delete();
  199. } else {
  200. File[] files = file.listFiles();
  201. for (File getFile: files) {
  202. deleteFolder(getFile);
  203. getFile.delete();
  204. }
  205. }
  206. } catch (Exception e) {
  207. e.printStackTrace();
  208. }
  209. }
  210.  
  211. }

依赖包如下:

===========================================

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. 微信小程序--家庭记账本开发--01

    微信小程序的开发准备与开发工具的学习 在这次寒假伊始,临近春节,学习进程有所拉下,现在补上.寻找了好多网站的相关学习视频,包括微信公众平台关于小程序这方面也有好多相关资料供查阅. 1.开发准备: 首先 ...

  2. React Component Lifecycle(生命周期)

    生命周期 所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键.RN 组件的生命周期整理如下图: 如图,可以把组件生命周期大致分为三个阶段: 第一阶段:是组件第一 ...

  3. pandas 必背函数操作

    1.五个常用属性 index,columns,shape,values,dtypes2.常用函数:set_index,reset_index,del df['column_name'],pd.read ...

  4. java单链表反转(花了半个多小时的作品)

    欢迎光临............... 首先我们要搞清楚链表是啥玩意儿?先看看定义: 讲链表之前我们先说说Java内存的分配情况:我们new对象的时候,会在java堆中为对象分配内存,当我们调用方法的 ...

  5. CSS,浮动及其影响

    浮动(float): 让默认文档流(标准文档流)下的元素漂浮起来,水平排列. 通俗点来说,浮动可以让元素浮到第二层,而其他没有浮动的元素就往上排,而我们是俯视去看的,所以往上顶的那个元素就会被遮住,这 ...

  6. GMA Round 1 新程序

    传送门 新程序 程序框图如图所示,当输入的n=时,输出结果的ans是多少? 容易看出该程序求n以内质数个数,50以内有15个. 定位:简单题

  7. (78)Wangdao.com第十五天_JavaScript 面向对象

    面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属 ...

  8. BOM 浏览器对象模型_同源限制

    “同源政策”(same-origin policy) 浏览器安全的基石 协议相同 域名相同 端口相同 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策 A 网页 ...

  9. Java作业一 (2017-9-10)

    /*程序员龚猛*/ 1.3 public class Helloworld{  public static void main(String[] args) {   System.out.printl ...

  10. day26:静态方法,类方法和反射

    1,包内部不要去尝试应用使用相对导入,一定不会成功的,他不支持这个机制,包内导入时一定要用绝对导入 2,复习接口类,抽象类,Python中没有接口类,有抽象类,抽象类是通过abc模块中的metacla ...