java 使用Jgit

1 篇文章 0 订阅

java 使用Jgit

前言

最近公司需要做一个调用git的工具,这里简单的介绍了一下基本操作方法以及一些衍生的信息获取,或有不对的地方请大家批评指正。转载请注明出处。

功能

  • 支持git克隆、拉取、获取所有的提交记录等

Jgit依赖导入

<dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit</artifactId>
      <version>4.4.1.201607150455-r</version>
    </dependency>

    <dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit.archive</artifactId>
      <version>5.8.1.202007141445-r</version>
    </dependency>

具体使用


import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;

import org.eclipse.jgit.api.ArchiveCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.PullResult;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.TransportException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;

import com.google.common.io.Files;

public class JgitTest {

    public static void main(String[] args) {
        String localDir = "D:\\git-test\\xxxx";
        String gitUrl = "https://gitee.com/xxxxxx.git";
        // 登录的手机号/邮箱等
        String username = "xxxxxx";
        // 密码 
        String password = "xxxxxxxx";
        String branch ="master";
//        gitClone(localDir, username, password,gitUrl,branch);
//        gitPull(localDir, username, password,gitUrl,branch);
        gitTag(localDir,branch);

    }

    /**
     * 克隆
     * @param localDir
     * @param username
     * @param password
     * @param gitUrl
     * @param branch
     */

    private static void gitClone(String localDir, String username, String password,String gitUrl,String branch) {
        File localpath = new File(localDir);
        //生成身份信息
        CredentialsProvider provider = new UsernamePasswordCredentialsProvider(username, password);
        try {
            // 如果本地目录已存在且是Git仓库,则跳过克隆
            if (localpath.exists() && Git.open(localpath).getRepository().isBare()) {
                System.out.println("Local repository already exists, skipping clone.");
            } else {
                // 初始化克隆操作
                Git.cloneRepository()
                        .setURI(gitUrl)
                        .setDirectory(localpath)
                        // 如果需要身份验证,设置凭证提供程序
                        .setCredentialsProvider(provider)
                        //设置是否克隆子仓库
                        .setCloneSubmodules(true)
                        //设置克隆分支
                        .setBranch(branch)
                        .call();

                System.out.println("Git repository cloned successfully to " + localpath.getAbsolutePath());
                //关闭git连接
                Git.open(localpath).close();
            }
        } catch (GitAPIException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 拉取
     * @param localDir
     * @param username
     * @param password
     * @param branch
     */

    private static void gitPull(String localDir, String username, String password,String gitUrl,String branch) {
        // 创建认证信息
        CredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(username,
                password);
        File localRepoDir = new File(localDir);

        try (Git git = Git.open(localRepoDir)) {
            // 执行pull操作
            git.pull()
                    // 如果需要身份验证,取消注释这一行
                     .setCredentialsProvider(credentialsProvider)
                    .setRemoteBranchName(branch)
                    .call();

            System.out.println("Git repository pulled successfully.");
        } catch (GitAPIException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // Git.open可能会抛出IOException,所以也需要捕获这个异常
            e.printStackTrace();
        }
    }

    /**
     * huoq 获取特定分支的commit历史
     * @param localDir
     * @param branch
     */
    private static void gitTag(String localDir,String branch)   {
        // 本地仓库的路径
        File localRepoDir = new File(localDir);
        try (Git git = Git.open(localRepoDir)) {
            // 获取特定分支的commit历史
            Iterable<RevCommit> commits = git.log()
                    .add(git.getRepository().resolve("refs/heads/"+branch)) // 替换为你的分支名
                    .call();

            for (RevCommit commit : commits) {
                System.out.println("Commit ID: " + commit.getName());
                System.out.println("Author: " + commit.getAuthorIdent().getName());
                System.out.println("Commit Message: " + commit.getFullMessage());
                System.out.println("Commit Time: " + commit.getCommitTime());
                System.out.println("-----------------------");
            }
        } catch (IOException  e) {
            e.printStackTrace();
        } catch (GitAPIException e) {
            throw new RuntimeException(e);
        }
    }

}

参考链接

参考文档:https://github.com/centic9/jgit-cookbook

官方文档:http://archive.eclipse.org/jgit/site/5.3.0.201903130848-r/apidocs/index.html

图片

在这里插入图片描述

这是一篇公众号文章

这是我的博客地址

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Gradle中使用JGit,您需要做以下几个步骤: 1. 在您的`build.gradle`文件中添加JGit的依赖项。您可以从Maven中央存储库中获取JGit的最新版本。在`dependencies`部分添加以下代码: ```groovy dependencies { implementation 'org.eclipse.jgit:org.eclipse.jgit:5.11.0.202105131744-r' } ``` 请注意,在这个例子中,我们使用JGit的5.11.0版本。您可以根据需要更换版本号。 2. 在您的Gradle脚本中,导入`org.eclipse.jgit.api`包来使用JGit的API。例如,在您的Java类中,您可以这样导入: ```java import org.eclipse.jgit.api.*; import org.eclipse.jgit.api.errors.*; import org.eclipse.jgit.lib.*; import org.eclipse.jgit.revwalk.*; import org.eclipse.jgit.transport.*; ``` 3. 您可以使用JGit来执行各种操作,例如克隆、拉取、推送等。这里是一个使用JGit克隆远程仓库的简单示例: ```java import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import java.io.File; public class JGitExample { public static void main(String[] args) { try { // 设置存储库目录 File localPath = File.createTempFile("test", ""); localPath.delete(); // 克隆远程仓库 System.out.println("Cloning into: " + localPath); Git.cloneRepository() .setURI("https://github.com/example/example.git") .setDirectory(localPath) .call(); System.out.println("Clone completed successfully."); } catch (GitAPIException e) { System.out.println("Failed to clone repository: " + e.getMessage()); } } } ``` 在此示例中,我们使用`Git.cloneRepository()`方法来克隆远程仓库,并将其存储在指定的本地路径中。 这只是一个简单的示例,您可以根据您的需求使用JGit执行其他操作。请参阅JGit文档以了解更多信息和示例:https://www.eclipse.org/jgit/documentation/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值