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