記錄瞬間
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(); } } }
依賴包如下:

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