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();
        }
    }

}

 

 依賴包如下:

 

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM