java使用jgit工具拉取代码和推送代码(干货)

本文章旨在提供,在java开发环境下,使用eclipse提供的jgit工具实现与远端git仓建立连接,拉取代码和提交

一、拉取代码

首先UsernamePasswordCredentialsProvider这个类,用于封装远端git地址的账户名和密码

import org.eclipse.jgit.api.CloneCommand;

 static CredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName", "password");

static final String DEFAULT_REMOTE_NAME = "origin";

/**
     * 拉取远端代码并切换分支
     *
     * @param filePath     本地文件路径
     * @param remoteGitUrl 远端git地址
     * @param branchName   分支名
     */
    public static void cloneAndCheckOutBranch(String filePath, String remoteGitUrl, String branchName)  {
        Git git = null;
        try {
            boolean remoteRepositoryExist = remoteRepositoryExist(remoteGitUrl);
            if (remoteRepositoryExist) {
                git = Git.cloneRepository()
                        .setDirectory(new File(filePath))
                        .setURI(remoteGitUrl)
                        .setCredentialsProvider(provider)
                        .call();
            } else {
                git = Git.init().setDirectory(new File(filePath)).call();
                git.remoteAdd()
                        .setName(Constant.DEFAULT_REMOTE_NAME)
                        .setUri(new URIish(remoteGitUrl))
                        .call();
                git.add().addFilepattern(".").call();
                git.commit().setMessage("Initial commit").call();

            }
            log.info("start to clone code");
             //生成身份信息
            // 如果文件目录下生成了.git仓  即是代码仓初始化了
            String currentBranch = git.getRepository().getBranch();
            // 如果本地有该分支
            if (branchIsExistInLocal(git, branchName)) {
                // 切换分支
                git.checkout().setCreateBranch(false).setName(branchName).call();
            } else if (!currentBranch.equals(branchName)) {
                // 创建并切换分支
                git.checkout().setCreateBranch(true).setName(branchName).call();
            }
            // 如果不是待切换分支  切换分支并拉取代码
            log.info("create branch begin->{}", branchName);
            if (branchIsExistInRemote(git, branchName)) {
                // 如果远端有该目标分支 先拉取代码
                git.pull().setCredentialsProvider(provider).call();
                git.push().setCredentialsProvider(provider).call();
            } else {
                git.push().setCredentialsProvider(provider).call();
            }
            log.info("create branch end->{}", branchName);
        } catch (Exception e) {
            log.error("JgitUtil.checkoutBranch;错误;拉取指定分支代码失败;异常信息:{}", e);
        } finally {
            if (git != null) {
                git.close();
            }
        }
    }

/**
     * 检验本地是否存在该分支
     *
     * @param branchName 分支名
     * @return 存在结果
     */
    private static boolean branchIsExistInLocal(Git git, String branchName) throws GitAPIException {
        try {
            Collection<Ref> refs = git.branchList().call();
            //检查是否存在
            for (Ref ref : refs) {
                if (ref.getName() != null && ref.getName().equals(Constants.R_HEADS + branchName)) {
                    return true;
                }
            }
            return false;
        } catch (TransportException e) {
            throw new BusinessException("Git库用户名密码错误,请重新配置!");
        } catch (GitAPIException e) {
            log.error("验证指定分支是否已在远程库创建时,发生错误", e);
            throw e;
        }


/**
     * 检验分支是否在远端存在
     *
     * @param branchName 分支名
     * @return 存在结果
     */
    private static boolean branchIsExistInRemote(Git git, String branchName) throws GitAPIException {
        try {
            //将本地远程分支信息与远程仓库同步
            git
                    .fetch()
                    .setCheckFetchedObjects(true)
                    .setRemoveDeletedRefs(true)
                    .setCredentialsProvider(provider)
                    .call();
            Collection<Ref> refs = git.lsRemote().setCredentialsProvider(provider).call();
            //检查是否存在
            for (Ref ref : refs) {
                if (ref.getName() != null && ref.getName().endsWith(branchName)) {
                    return true;
                }
            }
            return false;
        } catch (TransportException e) {
            throw new BusinessException("Git库用户名密码错误,请重新配置!");
        } catch (GitAPIException e) {
            log.error("验证指定分支是否已在远程库创建时,发生错误", e);
            throw e;
        }
    }

 /**
     * 判断远程仓库是不是存在
     *
     * @param remoteUrl 远程仓库地址
     * @return true(存在)/false(不存在)
     */
    public static boolean remoteRepositoryExist(String remoteUrl) {
        try {
            Collection<Ref> refs = (Collection<Ref>) Git.lsRemoteRepository()
                    .setHeads(true)
                    .setTags(true)
                    .setCredentialsProvider(provider)
                    .setRemote(remoteUrl)
                    .call();
            return !refs.isEmpty();
        } catch (Exception e) {
            log.warn("仓库{}不存在", remoteUrl);
            return false;
        }
    }

报红的话直接import进去就好了   

filePath是绝对路径(文件夹:E:\gitCommit这种类型)

remoteGitUrl是远端git地址 http://*****/*****/****.git

branch直接传入名字  比如master 

二、推送代码

import org.eclipse.jgit.api.CloneCommand;

static CredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName", "password");
 /**
     * 提交本地代码到远端代码仓
     *
     * @param description 提交说明
     * @param proPath     本地git仓路径
     * @param file        传输文件
     * @param remoteURL   远端git地址https://gitee.com/XXXX/XXXX.git
     * @param branch      分支名
     */
    public static void CommitCode(String description, String proPath, File file, String remoteURL, String branch) {
        Git git = null;
        try {
            //获取仓库对象
            Repository existingRepo = new FileRepositoryBuilder().setGitDir(new File(proPath + "\\.git")).build();
            git = new Git(existingRepo);
            String workTreePath = git.getRepository().getWorkTree().getCanonicalPath();
            log.info("workTreePath" + workTreePath);
            String pagePath = file.getCanonicalPath();
            log.info("pagePath" + pagePath);
            pagePath = pagePath.substring(workTreePath.length());
            pagePath = pagePath.replace(File.separatorChar, '/');
            if (pagePath.startsWith("/")) {
                pagePath = pagePath.substring(1);
            }
            log.info("the file path is " + pagePath);
            git.add().addFilepattern(pagePath).call();//添加文件
            log.info("add file success");
            SimpleDateFormat ymd = new SimpleDateFormat("yyyyMMdd");
            SimpleDateFormat hm = new SimpleDateFormat("HHmm");
            git.commit().setMessage(description + "_" + ymd.format(new Date()) + "_" + hm.format(new Date())).call();
            log.info("commit file success");
            git.push()
                    .setRemote(remoteURL)    //设置推送的URL名称
                    .setRefSpecs(new RefSpec(branch))   //设置需要推送的分支,如果远端没有则创建
                    .setCredentialsProvider(provider)   //身份验证
                    .call();
            log.info("------succeed add,commit,push files . to repository at " + existingRepo.getDirectory());
        } catch (Exception e) {
            log.error("git提交失败" + e.getMessage());
        } finally {
            if (git != null) {
                git.close();
                git.getRepository().close();
            }
        }
    }

三、创建代码仓


    /**
     * 创建git代码仓
     *
     * @param localPath 本地文件存储路径
     * @param gitUrl 代码仓地址
     */
    public static void createRepository(String localPath,String gitUrl) {
        Git git=null;
        try {
            Repository repository = new FileRepository(localPath.concat(".git"));
            git = new Git(repository);
            // 添加一个 Add-New-File.txt 文件,并向其中写入 Write By Code 字符串
            FileUtil.writeString("Write By Code",localPath.concat("Add-New-File.txt"), CharsetUtil.CHARSET_UTF_8);
            // 新增的文件添加到存储库,类似于 git add .
            git.add().addFilepattern(".").call();
            // 添加提交信息,并提交
            git.commit().setMessage("code by SST").call();
            // 添加远程仓库信息
            git.remoteAdd()
                    .setName("origin")
                    .setUri(new URIish(gitUrl))
                    .call();
            // 推送到远端 master 分支
            git.push()
                    .setRemote("origin")
                    .setCredentialsProvider(provider)
                    .add("master")
                    .call();

            // 关闭 git 命令
            git.close();
        } catch (IOException | GitAPIException | URISyntaxException e) {
           log.error("create repository fail->{}",e.getMessage());
        }finally {
            if(git!=null){
                git.close();
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值