当前位置: 首页 > 知识库问答 >
问题:

如何在克隆远程存储库时跳过使用JGit进行SSL验证?

俞飞鸣
2023-03-14

当我尝试使用JGit api克隆现有的远程git存储库时,出现以下错误。

例外:org。日食jgit。应用程序编程接口。错误。运输例外:http://admin@本地主机:7990/scm/cp/myrepo。git安全连接到https://admin@本地主机:7990/scm/cp/myrepo。由于SSL问题,无法建立git

在我的课堂上,我使用下面的方法来克隆存储库。

public static void cloneRepoTemp(String cloneRepoUrl, String username, String password)
            throws FileNotFoundException, IOException {

        Git git;
        try {

            git = Git.cloneRepository().setURI(cloneRepoUrl)
                    .setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password))
                    .setDirectory(new File("C:/temp/testrepo")).setBranch("integration").call();
            git.close();
        } catch (GitAPIException e) {
            System.out.println("Exception:" + e);
    }

我知道我可以通过使用下面的命令来解决这个问题,

git config --global http.sslVerify false

但是,由于我使用的是JGit api,我希望通过api本身来启用它,而不是在主机上显式设置。此外,我打算让库分布在多台机器上,所以不要在用户的机器上进行更改,以使我的代码正常工作。

有没有一种方法可以在代码中实现这一点,而无需在git配置文件中添加条目。

共有2个答案

武向文
2023-03-14

也许看看Config类,用Config.set布尔(分支,主,isSslVerify,false)

琴正初
2023-03-14

JGit确实有自己的存储库配置内部表示,它允许您(如@eugène adell所述)更改设置。其可通过存储库获取。getConfig()。问题是,cloneRepository命令创建存储库对象,并自动(从您的角度)调用克隆序列(fecth checkout),因此您没有时间更改存储库设置。

为了解决这个问题,我推荐一个穷人的克隆: init-

Repositoryrepo = Git.init().setDirectory(this.tempGitDir.toFile()).call();
repo.getRepository()
        .getConfig()
        .setBoolean("http", "https://selfsigned.server.com", "sslVerify", false);
URIish u = createURIish();
repo.remoteAdd()
        .setName("origin")
        .setUri(u)
        .call();
repo.pull()
        .setCredentialsProvider(new UsernamePasswordCredentialsProvider("token", pat))
        .setRemote("origin")
        .setRemoteBranchName("master")
        .call(); 

我们首先初始化回购协议,然后更改其sslVerify设置。注意:总是更喜欢每回购、每服务器sslVerify忽略;全局设置标志是一个安全问题。替换所连接服务器的特定“基本”url的url。

createUrish方法只是用远程URI创建一个新的Urish对象,我用一个单独的方法来降低复杂性(嵌套的trys):

private URIish createURIish() throws InvalidRemoteException {
    URIish u = null;
    try {
        u = new URIish(this.gitUrl);
    } catch (URISyntaxException e) {
        throw new InvalidRemoteException(
                MessageFormat.format(JGitText.get().invalidURL, this.gitUrl), e);
    }
    return u;
}

然后添加Urish作为新的远程设备,最后调用pull命令。为此,我使用了一个UsernamePasswordCredentialsProvider,这样我就可以通过连接到的TFS服务器使用的PAT,但是username:pasword在您使用时也应该可以。

 类似资料:
  • 这里的问题是,URL 被重定向,这在 JGit 中不处理。没有相同的错误报告,并且还提到它们已得到解决,但我仍然面临此问题。如果我做错了什么,请告诉我。 代码片段 运行代码后出现异常 更改以下代码后 例外 详情: 使用以下 JGit 版本 4.8.0.201706111038-r 也尝试了4.4.x.xxxxx版本

  • 问题内容: 我该怎么办 与JGIT库? 问题答案: 您不能,JGit尚不支持客户端上的浅表克隆(不过,它在服务器端上)。

  • 我有一个远程存储库,我试图使用它在本地进行克隆 这对于安装所有包和重新创建都很有效,但是我在最后得到了一个错误,这个错误似乎与Symfony2-中目录结构的变化有关 Sensio\Bundle\分布式包\Composer\ScriptHandler::buildBootstrap Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::cl

  • 问题内容: 我正在按照以下指南使用jGit克隆远程现有存储库: https://github.com/centic9/jgit- cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/CloneRemoteRepository.java 我在示例中使用CFML: 克隆的效果很好,但是在我停止Java进程之前,文件锁不会释放在其

  • 我试图克隆一个包含一个大文件(2GB以上)的存储库,因为本文提到Jgit可以处理的文件的最大大小是2GB。我看到通过pure git命令,我可以使用过滤大文件,现在我希望在使用Jgit的java代码中实现这个过滤器,这样我就可以避免异常目前我使用Jgit进行克隆,如下所示: 我想知道是否有选项添加过滤器到克隆,这样它就可以避免使用JGIT克隆大文件?

  • 下面的示例显示了如何列出远程标记,而无需克隆repo: 如何像上面的例子一样远程编辑/添加/删除新标签,而无需克隆存储库? 需要克隆回购协议。 有没有办法在不克隆回购协议的情况下实现这一点?