JGit学习以及基于JGit搭建一个简单的web库
本文记录了一些简单的JGit使用方法,同时基于JGit,设想搭建了一个可以实现一些简单的服务器通讯,将数据自动上传到Git服务器,白嫖一些远程的数据库。可以在以后的一些简单项目中,比如记账软件,进行集成。
同时这也是本人第一次接触maven,也当作学习笔记了。
同步blog:https://kingqibin.github.io/
环境
软件 | 版本 |
---|---|
jdk | v13.0.2 |
maven | v3.8.1 |
intellij idea | community 2020.3 |
创建maven项目
使用idea进行创建,这里使用空项目创建
我这边是这样创建的,也不是很清楚具体的maven项目到底是怎么样的,目前来说就这样算了,等后面再学习下吧
PS:在创建项目之前,最好把一些maven的配置给配好,比如国内镜像之类,我自己在用的时候即使改了setting,但是也会遇到intellij idea无法加载新配置的情况,依然用的是原先的配置,遇到这种情况就把项目创建的默认设置改一下,然后删库重新创建下就好了
pom.xml
<dependencies>
<!-- 导入JGit库 -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>5.2.1.201812262042-r</version>
</dependency>
<!-- 这里需要绑定一个简单实现的slf4j否则会提示没有实现的错误 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
<!-- 文件IO操作的一个库 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- json读取与解析 -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20201115</version>
</dependency>
</dependencies>
maven小知识:引入dependency时要先用<dependencies></dependencies>
标签引用起来
JGitWebSync设计
目前阶段考虑到需要的功能有
- clone远程库
- 加载本地库
- 添加修改文件
- 删除文件
- 仓库push来实现文件的提交
- 仓库pull来实现文件的同步
在实现时主要参考blog
0. ssh实现权限访问
private final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch defaultJSch = super.createDefaultJSch(fs);
defaultJSch.removeAllIdentity();
defaultJSch.addIdentity("~/.ssh/id_rsa");
return defaultJSch;
}
};
private final TransportConfigCallback transportConfigCallback = transport -> {
if (transport instanceof SshTransport) {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(JGitWebSync.this.sshSessionFactory);
}
};
这里的写法基本是固定的,其中的id_rsa是通过ssh-keygen -t rsa
生成获得的,如果之前生成了就不用管了,这里用的是私钥,而不是id_rsa.pub
1. clone远程库
有了权限后就可以clone库了
this.git = Git.cloneRepository()
.setTransportConfigCallback(this.transportConfigCallback)
.setURI(remoteURL) // 远程地址 这里推荐使用ssh地址
.setDirectory(repoDir) // 本地用来存放数据的文件夹 要为空文件夹
.call();
2. 加载本地库
Repository repository = new FileRepositoryBuilder()
.setGitDir(Paths.get(localPath, ".git").toFile())
.build();
this.git = Git.wrap(repository);
这里人通过读取本地目录下的.git
文件夹,之后使用Git.wrap
进行封装成Git
库
3. 添加修改文件
this.git.add().addFilepattern(fileName).call();
这里的fileName
为添加的文件正则表达式,这里推荐使用每个文件添加一次进行调用,不要 git add .
,不然在实际使用时可能会出现很多无用的添加,这里的fileName路径是相对于git库的路径,简言之跟普通的git使用是相同的
4. 删除文件
this.git.rm().addFilepattern(fileName).call();
这里的用法跟add
类似,众所周知直接删除文件,之后通过git add .
之后提交是可以更改git仓库的,但是JGit在push的时候并不能把删除操作同步到服务器(原版Git是可以的,可能是有什么bug?),实在想用也是可以的,但是还是需要手动调用this.git.remoteRemove()
指令,不如就直接使用rm()
了
5. 仓库push来实现文件的提交
// 提交
this.git.commit().setMessage(message).call();
// 推送
this.git.push()
.setTransportConfigCallback(this.transportConfigCallback)
.setRemote("origin")
.setRefSpecs(new RefSpec("master"))
.call();
这里将commit
和push
放到一起来实现,这里的setTransportConfigCallback
实现了ssh访问权限的加载,setRemote
和setRefSpecs
也可以当作接口暴露出来
6. 仓库pull来实现文件的同步
this.git.pull()
.setTransportConfigCallback(this.transportConfigCallback)
.setRemote("origin")
.call();
拉取就比较简单了,通上面的操作即可
还有一些其他的设计这里就不详细介绍了,可以参考
https://github.com/Kingqibin/JGitWebSync
后面的话看看有没有机会用该库写个小项目试一下,ok,如果有问题欢迎在下面留言评论~