首页 > 其他分享 >【git】基于JGit通过ssh-url拉取指定commit-id的代码

【git】基于JGit通过ssh-url拉取指定commit-id的代码

时间:2023-06-25 17:35:08浏览次数:42  
标签:git url 主机 拉取 密钥 客户端 格式 keygen ssh

实现

1️⃣ pom依赖:

<dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit</artifactId>
    <version>6.6.0.202305301015-r</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jgit</groupId>
    <artifactId>org.eclipse.jgit.ssh.jsch</artifactId>
    <version>6.5.0.202303070854-r</version>
</dependency>

2️⃣ JschConfigSessionFactory配置:

JSch与JGit

JSch 是一个纯 Java 实现的 SSH2 协议库,它提供了在 Java 程序中进行 SSH 通信的功能。JSch 允许你在 Java 应用程序中使用 SSH 协议进行远程命令执行、文件传输和端口转发等操作。

JGit 是一个用于访问 Git 版本控制系统的 Java 库,它提供了在 Java 应用程序中与 Git 仓库进行交互的功能。JGit 是 Eclipse Foundation 的一个项目,旨在为 Java 开发者提供一个功能齐全且易于集成的 Git 客户端库。

JschConfigSessionFactory 是基于 JSch 的一个辅助类,用于在 JGit 中配置 SSH 会话工厂。

配置
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
    @Override
    protected void configure(OpenSshConfig.Host host, Session session) {
        // 设置 SSH 客户端在连接远程服务器时不进行严格的主机密钥检查
        session.setConfig("StrictHostKeyChecking", "no");
    }

    @Override
    protected JSch createDefaultJSch(FS fs) throws JSchException {
        JSch jSch = super.createDefaultJSch(fs);
        // 添加私钥文件用于身份验证
        jSch.addIdentity(privateKey);
        return jSch;
    }
};
JschConfigSessionFactory工作流程

JGit中,首先createSession()方法被调用,方法内部调用getJSch()获取JSch实例,再调用JSch实例的getSession()方法获取Session对象。
getJSch()方法被调用时,createDefaultJSch()方法于内部被调用。
原始的createDefaultJSch()方法中,configureJSch()方法会被调用,但原始的configureJSch()方法内部为空。
createSession()方法中会调用configure()方法。

主机密钥检查

主机密钥检查(Host Key Checking)是在 SSH 连接过程中进行的一种安全机制,用于验证远程主机的身份和防止中间人攻击。

在 SSH 连接过程中,当客户端(例如使用 JSch 库的应用程序)首次连接到一个远程主机时,远程主机会返回自己的公钥。为了确保连接的远程主机是预期的主机而不是中间人,客户端会对远程主机的公钥进行验证。

主机密钥检查的过程如下:

  1. 客户端收到远程主机的公钥。

  2. 客户端会将远程主机的公钥与本地存储的已知主机密钥进行比较。

  • 如果已知主机密钥列表中存在与远程主机公钥匹配的密钥,表示该远程主机的身份是可信的,连接将继续进行。
  • 如果已知主机密钥列表中不存在匹配的密钥,表示该远程主机的身份是不可信的或是首次连接的主机,客户端会触发主机密钥检查流程。
  1. 主机密钥检查的具体行为取决于 SSH 客户端的配置:
  • 如果客户端的配置指定了接受新的主机密钥,客户端将自动接受远程主机的公钥,并将其添加到已知主机密钥列表中。这种配置一般用于自动化脚本等场景。
  • 如果客户端的配置要求用户手动确认新的主机密钥,客户端会提示用户确认该主机的公钥指纹是否可信。用户需要进行手动确认才能继续连接。
  • 如果客户端的配置指定了拒绝新的主机密钥,连接将被终止,并抛出异常或给出相应的错误提示。

3️⃣ 指定一不存在或为空的目录

Path tempDirectory = Paths.get("d:/tmp");

4️⃣ 基于JGit拉代码

try (Git git = Git.cloneRepository()
        .setURI(sshUrl)
        // 用于在回调中将自定义的session工厂配置到JGit中
        .setTransportConfigCallback(transport -> {
            SshTransport sshTransport = (SshTransport) transport;
            sshTransport.setSshSessionFactory(sshSessionFactory);
        })
        .setDirectory(new File(String.valueOf(tempDirectory)))
        // 禁用自动`checkout`,使得工作目录下不会出现克隆的文件,便于后续拉取指定id的代码
        .setNoCheckout(true)
        .call()) {
    // 解析commit-id
    ObjectId commitObjectId = git.getRepository().resolve(commitId);
    // 
    git.checkout().setName(commitObjectId.getName()).call();
}

标签:git,url,主机,拉取,密钥,客户端,格式,keygen,ssh
From: https://www.cnblogs.com/hsjia/p/17503077.html

相关文章

  • 部署PHP+Swoole实现自动更新项目的GitHub Webhooks
    前言在项目开发过程中,每次需要手动登录服务器并执行gitpull命令来更新代码,这样非常繁琐和耗时。为了简化这个过程,我们可以利用GitHub的Webhooks功能,结合PHP和Swoole来编写一个自动更新项目的接口脚本。实现步骤以下是实现自动更新项目的GitHubWebhooks的步骤:首先,你得有一个......
  • git提交规范 fix,feat等字段含义
    以下是commit提交规范,主要是在提交代码时标识本次提交的属性 feat:新功能(feature)fix:修补bugdocs:文档(documentation)style:格式(不影响代码运行的变动)refactor:重构(即不是新增功能,也不是修改bug的代码变动)chore:构建过程或辅助工具的变动revert:撤销,版本回退perf:......
  • 根据上传的excel文件url,进行文件查询
    HttpResponseresponse=HttpUtil.createGet(fileUrl).setConnectionTimeout(20000).setReadTimeout(120000).timeout(3600000).execute();InputStreaminputStream=response.bodyStream();booleanxls=ExcelFileUtil.isXls(inputStream......
  • git教程之签个名吧
    最近我成功用上gpg签名了,顺手写个教程啊等等,上次git教程写的啥来着才写到入门??而且是我整个公众号创立以来的第四篇文章?后面就再也没写过git??没有关系啊,好像把git的基础操作都简单讲了一遍,无伤大雅啊,下期再慢慢细说git的其他操作好了进入正题git教程之签个名gpg是啥首先先......
  • git配置和上传方法
    1.配置用户名和邮箱:gitconfig--globaluser.name"your_name"gitconfig--globaluser.email"your_email"2.生成SSHkeyssh-keygen-trsa-C"your_email"接下来会有三次输入,都敲回车置为空。3.查看自己的公钥cat~/.ssh/id_rsa.pub从ssh-rsa开头,全部复制......
  • github.com 打不开的准确方法
    解决方法:打开网站http://tool.chinaz.com/dns/,在A类型中填写github.com,再点击监测按钮复制下面任意一个ip打开电脑文件C:\Windows\System32\drivers\etc下的host文件在host文件的最后一刚加入刚才复制的IP20.205.243.166    github.com5.win+R打开cmd命窗口,执行......
  • 常用Git命令
    个人常用git命令更新本地不存咋修改直接pullgitpullorigin如果是分支则是gitpullorigin分支名字本地存在修改情况1:修改代码不重要直接还原后在更新情况2:修改代码很重要办法1此时可以本地提交,然后更新gitadd.gitcommit-m"说明情况"gitpullorigin但是......
  • Could not resolve type alias 'com.github.mybatis.helper.page.PageSqlInterceptor'
    报错信息 Couldnotresolvetypealias'com.github.mybatis.helper.page.PageSqlInterceptor'.Cause:java.lang.ClassNotFoundException:Cannotfindclass:com.github.mybatis.helper.page.PageSqlInterceptor 原因报错的位置是 mybatis-config.xml 文件中......
  • 在Linux下搭建Git服务器
    众所周知,版本系统在开发环境中是必不可少的,但是我们可以把代码免费的托管到GitHub上,如果我们不原意公开项目的源代码,公司又不想付费使用,那么我们可以自己搭建一台Git服务器,可以用Gitosis来管理公钥,还是比较方便的。搭建环境:服务器 CentOS6.6+git(version1.8.3.1)客户......
  • GIT保存记录原理之commit对象
    GIT中提交对象非常的重要,我们通过它记录代码提交过程、进行文件保存、回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的.git文件夹中。新建空项目```gitDemo```使用```gitinit```初始化,在文件夹根目录下会生成```.git```文件夹,文件夹中会......