JGit学习以及基于JGit搭建一个简单的web库

JGit学习以及基于JGit搭建一个简单的web库

本文记录了一些简单的JGit使用方法,同时基于JGit,设想搭建了一个可以实现一些简单的服务器通讯,将数据自动上传到Git服务器,白嫖一些远程的数据库。可以在以后的一些简单项目中,比如记账软件,进行集成。

同时这也是本人第一次接触maven,也当作学习笔记了。

同步blog:https://kingqibin.github.io/

环境

软件版本
jdkv13.0.2
mavenv3.8.1
intellij ideacommunity 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();

这里将commitpush放到一起来实现,这里的setTransportConfigCallback实现了ssh访问权限的加载,setRemotesetRefSpecs也可以当作接口暴露出来

6. 仓库pull来实现文件的同步

this.git.pull()
        .setTransportConfigCallback(this.transportConfigCallback)
        .setRemote("origin")
        .call();

拉取就比较简单了,通上面的操作即可

还有一些其他的设计这里就不详细介绍了,可以参考

https://github.com/Kingqibin/JGitWebSync


后面的话看看有没有机会用该库写个小项目试一下,ok,如果有问题欢迎在下面留言评论~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值