jgit查询远程仓库_JAVA 使用jgit管理git仓库

JAVA 使用jgit管理git仓库

最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下。

JGit是一款pure java的软件包,可以读写git仓库,下面介绍基本使用。

引入jgit

maven引入:

org.eclipse.jgit

org.eclipse.jgit

5.6.0.201912101111-r

jgit 有一个Git类,可以用来执行常规的git操作

凭证管理

通过CredentialsProvider管理凭证,常用的是UsernamePasswordCredentialsProvider

通过下面代码初始化:

public static CredentialsProvider createCredential(String userName, String password) {

return new UsernamePasswordCredentialsProvider(userName, password);

}

clone远程仓库

git 命令:

git clone {repoUrl}

通过Git.cloneRepository 来clone远程仓库,如果需要凭证,则需要指定credentialsProvider

public static Git fromCloneRepository(String repoUrl, String cloneDir, CredentialsProvider provider) throws GitAPIException{

Git git = Git.cloneRepository()

.setCredentialsProvider(provider)

.setURI(repoUrl)

.setDirectory(new File(cloneDir)).call();

return git;

}

commit

git 命令:

git commit -a -m '{msg}'

commit比较简单,对应commit方法, 注意需要先add

public static void commit(Git git, String message, CredentialsProvider provider) throws GitAPIException {

git.add().addFilepattern(".").call();

git.commit()

.setMessage(message)

.call();

}

push

git 命令:

git push origin branchName

push直接调用push即可, 需要指定credentialsProvider

public static void push(Git git, CredentialsProvider provider) throws GitAPIException, IOException{

push(git,null,provider);

}

public static void push(Git git, String branch, CredentialsProvider provider) throws GitAPIException, IOException{

if (branch == null) {

branch = git.getRepository().getBranch();

}

git.push()

.setCredentialsProvider(provider)

.setRemote("origin").setRefSpecs(new RefSpec(branch)).call();

}

读取已有仓库

如果git已经clone了,想直接读取,怎么办?

public static Repository getRepositoryFromDir(String dir) throws IOException{

return new FileRepositoryBuilder()

.setGitDir(Paths.get(dir, ".git").toFile())

.build();

}

读取仓库日志

可以通过RevWalk读取仓库日志。

revWalk.parseCommit 可读取一条commit

遍历revWalk,可读取所有日志

public static List getLogs(Repository repository) throws IOException{

return getLogsSinceCommit(repository, null, null);

}

public static List getLogsSinceCommit(Repository repository, String commit) throws IOException{

return getLogsSinceCommit(repository, null, commit);

}

public static List getLogsSinceCommit(Repository repository, String branch, String commit) throws IOException{

if (branch == null) {

branch = repository.getBranch();

}

Ref head = repository.findRef("refs/heads/" + branch);

List commits = new ArrayList<>();

if (head != null) {

try (RevWalk revWalk = new RevWalk(repository)) {

revWalk.markStart(revWalk.parseCommit(head.getObjectId()));

for (RevCommit revCommit : revWalk) {

if (revCommit.getId().getName().equals(commit)) {

break;

}

commits.add(revCommit.getFullMessage());

System.out.println("\nCommit-Message: " + revCommit.getFullMessage());

}

revWalk.dispose();

}

}

return commits;

}

测试

我们来先clone仓库,然后修改,最后push

String yaml = "dependencies:\n" +

"- name: springboot-rest-demo\n" +

" version: 0.0.5\n" +

" repository: http://hub.hubHOST.com/chartrepo/ainote\n" +

" alias: demo\n" +

"- name: exposecontroller\n" +

" version: 2.3.82\n" +

" repository: http://chartmuseum.jenkins-x.io\n" +

" alias: cleanup\n";

CredentialsProvider provider = createCredential("USR_NAME", "PASSWORD");

String cloneDir = "/tmp/test";

Git git = fromCloneRepository("http://gitlab.GITHOST.cn/datahub/env-test.git", cloneDir, provider);

// 修改文件

FileUtils.writeStringToFile(Paths.get(cloneDir, "env", "requirements.yaml").toFile(), yaml, "utf-8");

// 提交

commit(git, "deploy(app): deploy springboot-rest-demo:0.0.5 to env test", provider);

// push 到远程仓库

push(git, "master", provider);

git.clean().call();

git.close();

FileUtils.deleteDirectory(new File(cloneDir));

读取已有仓库的日志:

Repository repository = getRepositoryFromDir("GIT_DIR");

List logs = getLogs(repository);

System.out.println(logs);

RevCommit head = getLastCommit(repository);

System.out.println(head.getFullMessage());

小结

本文讲述了如何通过jgit完成常规的git操作。

作者:Jadepeng

出处:jqpeng的技术记事本–http://www.cnblogs.com/xiaoqi

可以使用ProcessBuilder类来执行git clone命令,然后将加密后的密码传递给命令行。 下面是一个示例: 1. 使用openssl生成加密密码 ``` $ echo "mypassword" | openssl enc -aes-256-cbc -a -salt -pass pass:mysecretpassword U2FsdGVkX1/lXXJw2ZxQ9A8FjD7UJfNkE3R1CQG4F9E= ``` 这里使用了AES-256-CBC算法对密码进行加密,并使用了一个加密密钥"mysecretpassword"。加密后的密码为"U2FsdGVkX1/lXXJw2ZxQ9A8FjD7UJfNkE3R1CQG4F9E="。 2. 使用ProcessBuilder执行git clone命令 可以使用ProcessBuilder类来执行git clone命令,将加密后的密码传递给命令行。 ``` String encryptedPassword = "U2FsdGVkX1/lXXJw2ZxQ9A8FjD7UJfNkE3R1CQG4F9E="; String gitUrl = "git@gitlab.com:myrepo/myproject.git"; String localPath = "/home/user/myproject"; ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "export GIT_SSH_COMMAND=\"sshpass -p '" + encryptedPassword + "' ssh -o StrictHostKeyChecking=no\" && git clone " + gitUrl + " " + localPath); Process p = pb.start(); int exitCode = p.waitFor(); ``` 这里的命令使用了sshpass工具来传递加密后的密码,以便在git clone命令中使用。请注意,使用sshpass工具不是最安全的选项,因为密码在命令行中可见。应根据实际情况选择更加安全的方式。 注意:这种方式仅提供了一种简单的加密方式,不能保证绝对的安全性。实际使用时,应根据实际情况选择更加安全的加密方式。另外,建议使用JGit等库来执行git操作,以便更好地控制和管理git操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值