不多说了,copy的累死我了,真心不好找 -_-
JGit 通过SSH私钥文件clone/pull代码
1.目的及准备工作
# 目的:通过jgit框架通过SSH密钥文件来连接git仓库并clone代码到本地
# 准备工作:
1.需要一个私钥文件,比如C:\Users\xxx\.ssh\id_rsa这个文件,如果是ppk文件(putty生成的用来验证git仓库权限的文件),则找到 puttygen.exe,双击运行后,点击Conversions->import Key(导入ppk文件)->Save private key(保存为一个无后缀名的文件)
2.项目引入Jgit依赖
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>3.7.0.201502260915-r</version>
</dependency>
2.通过java代码进行clone
package com.jgittest.util;
import java.io.File;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshSessionFactory;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.util.FS;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
/**
* git操作工具类
* @author houjiayin.co
*
*/
public class GitUtil {
public static void main(String[] args) {
String localCodeDir = "H:/myGitRepository"; //本地文件夹
String remoteRepoPath = "ssh://***"; //git地址
String keyPath = "H:/private_key" //私钥文件
gitClone(remoteRepoPath, localCodeDir,keyPath);
}
//localRepoPath 为本地文件夹
//keyPath 私钥文件 path
//remoteRepoPath 为 ssh git远端仓库地址
protected static void gitClone(String remoteRepoPath, String localRepoPath,String keyPath) {
//ssh session的工厂,用来创建密匙连接
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host host, Session session ) {
session.setConfig("StrictHostKeyChecking","no");
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch sch = super.createDefaultJSch(fs);
sch.addIdentity(keyPath); //添加私钥文件
return sch;
}
};
//克隆代码库命令
CloneCommand cloneCommand = Git.cloneRepository();
Git git = null;
try {
git = cloneCommand.setURI(remoteRepoPath) //设置远程URI
.setTransportConfigCallback(transport -> {
SshTransport sshTransport = ( SshTransport )transport;
sshTransport.setSshSessionFactory( sshSessionFactory );
})
.setDirectory(new File(localRepoPath)) //设置下载存放路径
.call();
System.out.println("success");
} catch (Exception e) {
System.out.println("fail");
e.printStackTrace();
} finally {
if (git != null) {
git.close();
}
}
}
3. pull代码
//localRepoPath 为 .git 的 path 如 : D:\\gitRepository\\.git
//keyPath 私钥文件 path
public static void pullCode(String remoteRepoPath, String localRepoPath, String keyPath) {
System.out.println("===" + remoteRepoPath + "===" + localRepoPath + "===" + keyPath);
//ssh session的工厂,用来创建密匙连接
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch sch = super.createDefaultJSch(fs);
sch.addIdentity(keyPath);
return sch;
}
};
try {
//关联到本地仓库
FileRepository fileRepository = new FileRepository(new File(localRepoPath));
Git pullGit = new Git(fileRepository);
//设置密钥,拉取文件
PullCommand pullCommand = pullGit
.pull()
.setTransportConfigCallback(
transport -> {
SshTransport sshTransport = ( SshTransport )transport;
sshTransport.setSshSessionFactory( sshSessionFactory );
});
pullCommand.call();
}catch (Exception e) {
e.printStackTrace();
}
}
JGit 获取提交信息/详细提交日志
1.提交信息
//此方法获取了仓库内(path下,有可能为仓库下子文件夹)的所有提交版本号
public static List<String> getGitVersions(String path) {
List<String> versions = new ArrayList<>();
try {
Git git = Git.open(new File(path));
Repository repository = git.getRepository();
Git git1 = new Git(repository);
Iterable<RevCommit> commits = git.log().all().call();
int count = 0;
for (RevCommit commit : commits) {
System.out.println("LogCommit: " + commit);
System.out.println("===" + commit.getFullMessage());
String version = commit.getName(); //版本号,用来查询详细信息
versions.add(version);
System.out.println("===" + commit.getName());
System.out.println("===" + commit.getAuthorIdent());
count++;
}
return versions;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
2. 获取提交的详细信息
/**
* 获取两个版本间提交详细记录
* @param path
*/
//version 为 上一个方法查询出来的版本号
public static void showDiff(String path,String oldVersion,String newVersion) {
try {
Git git = Git.open(new File(path));
Repository repository = git.getRepository();
//旧版本
AbstractTreeIterator oldTreeParser = prepareTreeParser(repository, oldVersion);
//新版本
AbstractTreeIterator newTreeParser = prepareTreeParser(repository, newVersion);
List<DiffEntry> diff = git.diff().
setOldTree(oldTreeParser).
setNewTree(newTreeParser).
call();
for (DiffEntry entry : diff) {
System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
//此处可传一个输出流获取提交详情
DiffFormatter formatter = new DiffFormatter(System.out);
formatter.setRepository(repository);
formatter.format(entry);
}
}catch (Exception e) {
e.printStackTrace();
}
}
附几个有用的 jgit 资料地址
# git官网对jgit的介绍
https://git-scm.com/book/zh/v2/%E9%99%84%E5%BD%95-B%3A-%E5%9C%A8%E4%BD%A0%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%AD%E5%B5%8C%E5%85%A5-Git-JGit
# jgit超有用的各种demo地址
https://github.com/centic9/jgit-cookbook
# 一些常用的jgit方法
https://my.oschina.net/u/4339481/blog/4748737
网友评论