精华内容
下载资源
问答
  • JGit

    千次阅读 2019-01-20 13:19:45
    JGit 参考:https://yonge812.iteye.com/blog/1687480 概念: 就是用java代码实现git的命令行操作 JGit API: https://download.eclipse.org/jgit/site/5.2.1.201812262042-r/apidocs/index.html 打开git仓库...

    JGit

    参考:https://yonge812.iteye.com/blog/1687480

    概念:

    就是用java代码实现git的命令行操作

    JGit API:

    https://download.eclipse.org/jgit/site/5.2.1.201812262042-r/apidocs/index.html

    打开git仓库 

    Git git=Git.open(new File(“FilePath”))

    获取检出命令对象

    CheckoutCommand  cc=git.checkout()

    给检出命令对象设置指定的提交版本号或分支名

    cc.setName(“版本号或者分支名”)

    执行检出命令

    cc.call();

     

    TreeWalk

    该类可以根据需要在尽可能多的树中执行n路差异。

    RevWalk

    遍历提交图并按顺序生成匹配的提交

     

    应用:

    需求:利用java程序和每次提交代码生成的commitid来获取该次提交的所有文件

    公司的要求在每次提交工单,并且测试通过之后,要把该次提交生成的文件放到一个对应的工单文件夹并上传到指定仓库

    本项目采用maven架构,出于内网环境的考虑,也可以改为普通java项目

    需要用到的jar包(pom.xml):

    		<dependency>
    			<groupId>org.eclipse.jgit</groupId>
    			<artifactId>org.eclipse.jgit</artifactId>
    			<version>4.8.0.201706111038-r</version>
    		</dependency>

    常量类

    设置参数

    package com.wowowo.constant;
    
    public class JGitConstant {
    	/**
    	 * 文件路径复制过来之后把\替换成/!!!!!
    	 * 如果想要获取以前提交的文件,把flag设为true,并填写你当前版本的commitid,如果在提交之后直接获取修改的文件,flag设为false
    	 * 
    	 */
    	// 仓库所在url
    	public static final String gitRoot = "";
    	// 该次提交的commitid,长id
    	public static final String revision = "";
    	// 要保存到的代码文件夹所在位置
    	public static final String destPath = "";
    
    	// --------------------------------------------------------------------------------
    	// 如果想要获取以前提交的文件,把flag设为true
    	public static final Boolean flag = false;
    	// currentid填你当前版本的commitid
    	public static final String currentid = "";
    	// --------------------------------------------------------------------------------
    
    }

    getLog()

    根据版本号版和其前一个版本的差异获取DiffEntry  list

    代码解析:

    根据commitid获取所有的revcommit 迭代器,里面存放历次提交信息

    Iterator和Iterable接口的区别

    https://www.cnblogs.com/keyi/p/5821285.html

    拿出2个revocommit的revwalk

    新建treewalk对象

    把2个revwalk放入treewalk对象中

    DiffEntiry.scan 方法传入treewalk参数,获取差异list

    	public static List<DiffEntry> getLog() throws Exception {
    		//load();
    		git = Git.open(new File(gitRoot));
    		// 我走了,本地版本切换该commitid的版本
    		if (flag) {
    			git.checkout().setName(revision).call();
    		}
    		Repository repository = git.getRepository();
    		ObjectId objId = repository.resolve(revision);
    		Iterable<RevCommit> allCommitsLater = git.log().add(objId).call();
    		Iterator<RevCommit> iter = allCommitsLater.iterator();
    		RevCommit commit = iter.next();
    		TreeWalk tw = new TreeWalk(repository);
    		tw.addTree(commit.getTree());
    		commit = iter.next();
    		if (commit != null)
    			tw.addTree(commit.getTree());
    		else
    			return null;
    		tw.setRecursive(true);
    		RenameDetector rd = new RenameDetector(repository);
    		rd.addAll(DiffEntry.scan(tw));
    
    		return rd.compute();
    	}

    获取提交的文件名,拷贝文件

    	public static void getCommitPath(List<DiffEntry> list) {
    		try {
    			for (DiffEntry diffEntry : list) {
    				// 跳过删除的文件
    				if (diffEntry.getOldPath().equals("/dev/null")) {
    					System.out.println("删除了" + diffEntry.getNewPath());
    					continue;
    				} else if (diffEntry.getNewPath().equals("/dev/null")) {
    					System.out.println("新建的文件:" + diffEntry.getOldPath());
    				} else {
    					System.out.println("修改的文件:" + diffEntry.getOldPath());
    				}
    				String srcFile = gitRoot + "/" + diffEntry.getOldPath();
    				String destDir = destPath + "/"
    						+ diffEntry.getOldPath().substring(0, diffEntry.getOldPath().lastIndexOf("/"));
    				String destFile = destPath + "/" + diffEntry.getOldPath();
    				fileDir = new File(destDir);
    				fileDir.mkdirs();
    				file = new File(destFile);
    				System.out.println(destFile);
    				file.createNewFile();
    				CopyFiles.copy(new File(srcFile), new File(destFile));
    				// System.out.println("要拷贝的源文件地址"+gitRoot +
    				// diffEntry.getOldPath());
    				// System.out.println("复制到的目标文件地址"+destPath +
    				// diffEntry.getOldPath());
    				System.out.println("**************************************************************************");
    			}
    			// 我又回来啦!,拷贝完毕,回到当前版本
    			if (flag) {
    				git.checkout().setName(currentid).call();
    			}
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}

     

     

     

    展开全文
  • jgit_JGit入门

    2020-05-19 10:35:52
    jgit 如果您想知道如何在JGit中执行git init , git checkout等基本的Git命令,请继续阅读。 本教程概述了最常用的git命令及其在JGit中的对应命令。 它逐步执行以下步骤:创建存储库,从远程获取内容,向历史记录...

    jgit

    如果您想知道如何在JGit中执行git initgit checkout等基本的Git命令,请继续阅读。

    本教程概述了最常用的git命令及其在JGit中的对应命令。 它逐步执行以下步骤:创建存储库,从远程获取内容,向历史记录添加文件或从历史记录中删除文件,检查历史记录,最后将更改推回原始存储库。

    JGit提供了一个类似于Git高级命令的API。 代替

    git commit -m "My first commit"

    在命令行上,您将编写

    git.commit().setMessage( "My first commit" ).call();

    在JGit中。

    所有JGit命令都有一个call()方法,设置该命令后,该方法将用于实际执行它。 这些类以各自的Git命令后缀Command命名。 尽管某些命令提供了公共构造函数,但建议使用Git工厂类来创建命令实例,如上例所示。

    获取图书馆

    但是在进一步研究JGit API之前,让我们先掌握该库。 获取JGit的最常见方法可能是从Maven存储库中。 但是,如果您更喜欢OSGi捆绑软件,那么还可以使用p2存储库。 下载页面列出了集成库所需的信息。

    在本文的范围内,将称为核心库的项目集成到project / bundle org.eclipse.jgit中就足够了。 如果您对JGit源代码存储库中的内容感兴趣,我建议阅读JGit源代码简介。

    创建一个仓库

    首先,我们需要一个存储库。 为了掌握这种情况,我们可以初始化一个新的存储库或克隆一个现有的存储库。

    InitCommand使我们可以创建一个空的存储库。 下一行

    Git git = Git.init().setDirectory( "/path/to/repo" ).call();

    将在给setDirectory()的位置创建一个带有工作目录的存储库。 .git目录将直接位于/path/to/repo/.git中。 有关InitCommand的详细说明,请阅读使用JGit初始化Git存储库

    可以使用CloneCommand克隆现有的存储库

    Git git = Git.cloneRepository()
      .setURI( "https://github.com/eclipse/jgit.git" )
      .setDirectory( "/path/to/repo" )
      .call();

    上面的代码会将JGit存储库克隆到本地目录“ path / to / repo”中。 CloneCommand的所有选项在如何使用JGit克隆Git存储库中进行了详细介绍

    如果您碰巧已经要使用现有的本地存储库,则可以按照如何使用JGit访问Git存储库中所述进行操作

    完成后关闭Git

    请注意,如果不再需要关闭未显式关闭(git.close())的命令,则返回InitCommand或CloneCommand之类的Git实例的命令可能会泄漏文件句柄。

    幸运的是,Git实现了AutoCloseable,因此您可以使用try-with-resources语句

    填充存储库

    现在我们有了一个存储库,我们可以开始填充其历史记录。 但是,为了提交文件,我们首先需要将其添加到所谓的索引(也称为暂存区)中。 commit命令将仅考虑在索引中添加(或从索引中删除)的文件。

    因此,JGit命令是–您猜到了– AddCommand。

    DirCache index = git.add().addFilePattern( "readme.txt" ).call();

    因此,以上行将文件readme.txt添加到索引中。 值得注意的是,文件的实际内容被复制到索引中。 这意味着以后对文件的修改将不包含在索引中,除非再次添加它们。

    给addFilePattern()提供的路径必须相对于工作目录根目录。 如果路径未指向现有文件,则将其忽略。

    尽管方法名称暗示也可以接受模式,但是以前的JGit支持是有限的。 传递“。” 将以递归方式添加工作目录中的所有文件。 但是尚不支持本地Git中可用的fileglob(例如* .java)。

    可以检查JGit中名为DirCache的call()返回的索引,以验证它是否确实包含我们期望的内容。 其getEntryCount()方法返回文件总数,而getEntry()返回指定位置的条目。

    现在,一切准备就绪,可以使用CommitCommand来将更改存储在存储库中。

    RevCommit commit = git.commit().setMessage( "Create readme file" ).call();

    至少必须指定消息,否则call()会发出NoMessageException投诉。 但是,允许输入空消息。 如果未使用相应标记的方法表示作者和提交者,则将其从配置中删除。

    返回的RevCommit用消息,作者,提交者,时间戳记来描述提交,当然还指向构成该提交的文件和目录树的指针。

    与需要添加新文件或更改文件的方式相同,需要明确删除已删除的文件。 RmCommand与AddCommand是对等的,并且可以以相同的方式使用(当然会产生相反的结果)。

    DirCache index = git.rm().addFilepattern( "readme.txt" ).call();

    上一行将再次删除给定的文件。 由于它是存储库中的唯一文件,因此当询问其中的条目数时,返回的索引将返回零。

    除非指定了setCached(true),否则该文件还将从工作目录中删除。 由于Git不跟踪目录,因此RmCommand还会删除给定文件的空父目录。

    删除不存在文件的尝试将被忽略。 但是与AddCommand不同,RmCommand在其addFilepattern()方法中不接受通配符。 所有要删除的文件都需要单独指定。

    在下一次提交时,这些更改将存储在存储库中。 请注意,创建一个空的提交是完全合法的,即在执行之前没有添加或删除文件的提交。 虽然我不知道一个合适的用例。

    储存库状态

    status命令列出了索引与当前HEAD提交或工作目录之间具有差异的文件,以及索引或Git未跟踪的文件。

    StatusCommand以其最简单的形式收集属于该存储库的所有文件的状态:

    Status status = git.status().call();

    Status对象的获取器应该是不言自明的。 它们返回处于方法名描述状态的文件名集。 例如,将readme.txt文件添加到如上所示的索引中之后,status.getAdded()将返回一个集合,其中包含刚添加的文件的路径。

    如果根本没有差异,也没有未跟踪的文件,则Status.isClean()将返回true。 顾名思义,如果存在未提交的更改,则返回Status.hasUncommittedChanges()true。

    使用addPath(),可以将StatusCommand配置为仅显示某些文件的状态。 给定的路径必须命名文件或目录。 不存在的路径将被忽略,并且不支持正则表达式或通配符。

    Status status = git.status().addPath( "documentation" ).call();

    在上面的示例中,将递归计算“文档”目录下所有文件的状态。

    浏览存储库

    现在,该存储库具有(较小的)历史记录,我们将研究该命令以列出现有提交。

    JGit的git log对应物的最简单形式允许列出当前HEAD可以访问的所有提交。

    Iterable<RevCommit> iterable = git.log().call();

    返回的迭代器可用于遍历LogCommand找到的所有提交。

    对于更高级的用例,我建议直接使用RevWalk API,该类与LogCommand也使用相同的类。 除了提供更大的灵活性之外,它还避免了可能发生的资源泄漏,因为LogCommand内部使用的RevWalk永远不会关闭。

    例如,其markStart()方法还可用于列出其他分支(或更普遍地说,其他引用 )可到达的提交。

    不幸的是,仅接受ObjectId,因此需要首先解析所需的引用。 JGit中的ObjectId封装了一个SHA-1哈希,该哈希指向Gits对象数据库中的一个对象。 此处,指向提交的ObjectId是必需的,在这种情况下解析意味着获取特定引用所指向的ObjectId。

    放在一起,看起来就像下面的代码片段:

    Repository repository = git.getRepository()
    try( RevWalk revWalk = new RevWalk( repository ) ) {
      ObjectId commitId = repository.resolve( "refs/heads/side-branch" );
      revWalk.markStart( revWalk.parseCommit( commitId ) );
      for( RevCommit commit : revWalk ) {
        System.out.println( commit.getFullMessage );
      }
    }

    获取分支“侧分支”所指向的提交ID,然后指示RevWalk从那里开始遍历历史记录。 因为markStart()需要RevCommit,所以RevWalk的parseCommit()用于将提交ID解析为实际的提交。

    一旦RevWalk设置好,该代码段就会在提交上循环以打印每次提交的消息。
    try-with-resource语句可确保完成后将关闭RevWalk。 请注意,多次调用markStart()以便在遍历中包含多个引用是合法的。

    RevWalk也可以配置为通过匹配提交对象本身的属性或匹配其表示的目录树的路径来过滤提交。 如果事先知道,则可以将不感兴趣的提交及其祖先链从输出中排除。 当然可以对输出进行排序,例如按日期或拓扑排序(所有孩子都在父母之前)。 但是这些功能不在本文讨论范围之内,但可能会在以后的文章中进行介绍。

    与远程存储库交换

    通常,本地存储库是从远程存储库克隆的。 并且本地所做的更改最终应发布到原始存储库。 为此,需要使用git push的对应项PushCommand。

    最简单的形式将当前分支推送到其相应的远程分支。

    Iterable<PushResult> iterable = local.push().call();
    PushResult pushResult = iterable.iterator().next();
    Status status 
      = pushResult.getRemoteUpdate( "refs/heads/master" ).getStatus();

    该命令返回一个可迭代的PushResults。 在上述情况下,迭代器仅包含一个元素。 为了验证推送是否成功,可以要求pushResult返回给定分支的RemoteRefUpdate。

    RemoteRefUpdate详细描述了更新内容以及更新方式。 但它也有一个状态属性,用于总结结果。 并且如果状态返回OK,我们可以放心操作成功。

    即使该命令在没有给出任何建议的情况下也可以运行,但是它具有许多选项,在下面仅列出了更常用的选项。 默认情况下,该命令将推送到名为“ origin”的默认遥控器。 使用setRemote()可以指定其他远程存储库的URL或名称。 如果其他分支比当前应该推refspecs可以与setRefSpec()来指定。 可以使用setPushTags()来控制是否也应传送标签。 最后,如果不确定是否需要结果,则可以使用空运行选项来模拟推送操作。

    现在,我们已经了解了如何将本地对象传输到远程存储库,我们将了解相反的方向。 FetchCommand的用法与推入命令非常相似,并且默认设置也可以成功使用。

    FetchResult fetchResult = local.fetch().call();
    TrackingRefUpdate refUpdate 
      = fetchResult.getTrackingRefUpdate( "refs/remotes/origin/master" );
    Result result = refUpdate.getResult();

    如果不进行进一步的配置,该命令将从与默认远程服务器上当前分支相对应的分支中获取更改。

    FetchResult提供有关操作结果的详细信息。 对于每个受影响的分支,都可以获取TrackingRefUpdate实例。 最有趣的可能是getResult()的返回值,该值总结了更新的结果。 此外,它还包含有关以下信息的信息:使用哪个远程引用(getRemoteName())更新了哪个本地引用(getLocalBame()),以及更新前后本地引用指向的对象id(getOldObjectId()和getNewObjectid())。

    如果远程存储库需要身份验证,则可以使用与所有与远程存储库通信的命令相同的方式来准备PushCommand和FetchCommand。

    结束语JGit入门

    现在轮到您向Tkae JGit兜风了。 不难理解高级JGit API。 如果您知道要使用什么git命令,则可以轻松猜测JGit中要使用的类和方法。

    尽管并非所有Git命令行的精妙之处都可用,但它对最常用的功能提供了可靠的支持。 而且,如果有一些关键的缺失,您通常可以使用JGit的低级API来解决该限制。

    整篇文章中显示的摘录是一系列学习测试的摘录。

    如果您仍然有困难或问题,请发表评论或向友好而乐于助人的JGit社区寻求帮助。

    翻译自: https://www.javacodegeeks.com/2015/12/getting-started-jgit.html

    jgit

    展开全文
  • Update jgit

    2020-11-28 20:13:41
    <div><p>Update jgit <ul><li>[x] a summary of the change</li><li>either<ul><li>[ ] a link to the issue you are resolving (for small changes)</li><li>[x] a link to the PR you just created (for big ...
  • jgit_JGit源代码简介

    2020-05-13 16:25:52
    jgit JGit是实现Git版本控制系统的纯Java库。 这是一个Eclipse项目,最初是EGit的Git库,它提供了与Eclipse的Git集成。 同时,JGit还有更多采用者,例如Gerrit,GitBlit,Jenkins的GitClient插件(正在开发中),…...

    jgit

    JGit是实现Git版本控制系统的纯Java库。 这是一个Eclipse项目,最初是EGit的Git库,它提供了与Eclipse的Git集成。 同时,JGit还有更多采用者,例如Gerrit,GitBlit,Jenkins的GitClient插件(正在开发中),…

    它的许可许可 ,很少的依赖关系和较低的要求使其易于将JGit嵌入任何Java应用程序中。 核心库需要Java 1.5, JSch来建立SSH连接,并需要JavaEWAH来进行快速位阵列操作。 最新版本是3.1,并于去年6月发布。 新的和值得注意的提供了新版本的更多细节。

    从哪里获得

    下载页面列出了获取和集成库的不同方法。 可能最常见的方法是从Maven存储库中获取JGit。 如果您更喜欢OSGi捆绑软件,那么这里有一个p2存储库。 最后,您可以下载JGit核心库,获取JSch和JavaEWAH的副本,然后将jar手动添加到您的构建路径中。

    虽然二进制文件可以很好地开发您的软件,但您可能也对源文件感兴趣。 是因为您发现了要修复的错误或要实施的功能,还是出于好奇…

    从源头工作

    package-explorer-jgit 虽然JGit可以以各种形式使用,但它是作为一组OSGi捆绑包开发的。 这要求在开发IDE中安装PDE

    源代码位于Git存储库中(猜猜是什么)。 因此,第一步很明显:从https://git.eclipse.org/r/p/jgit/jgit.git克隆存储库

    核心库的代码位于单个项目中:org.eclipse.jgit。 如果您使用Java 7,那么org.eclipse.jgit.java7也可能很有趣。 该片段项目集成了Java 7文件系统API,因此JGit可以从文件操作(例如符号链接)的改进的可移植性中受益。

    要提供依赖关系,请将当前目标平台设置为org.eclipse.jgit.target项目(隐藏在org.eclipse.jgit.packaging文件夹中)中包含的目标定义。 总之,对于核心库,您需要导入以下项目:

    • org.eclipse.jgit —核心库本身
    • org.eclipse.jgit.java7-支持Java 7文件系统
    • org.eclipse.jgit.target —包含目标平台定义

    如果您看到错误标记抱怨缺少API基线,请告诉PDE现在忽略它(“窗口”>“首选项”>“插件开发”>“ API基线”)。

    运行测试

    现在代码已编译,让我们运行测试以验证设置。 因此,有三个项目值得关注。 org.eclipse.jgit.junit提供实用程序来设置和拆除测试方案。 org.eclipse.jgit.test和org.eclipse.jgit.java7.test包含相应代码项目的测试。 除非您没有安装Java 7,否则请全部导入其中的三个。

    启动配置jgit JGit源附带了预定义的启动配置,以运行所有测试。 选择与您的JRE版本匹配的“所有测试”配置并运行它。 “所有外部测试”配置运行所有常规测试以及当前与本机Git交互的另一项测试。 因此,它们要求在您的可执行搜索路径上安装本机Git。

    如果看到testMaliciousPathEmpty失败,则可能是在Windows上运行并被错误396662击中

    核心图书馆结构

    Git可以分为两层, 瓷器层和管道层 管道层提供执行底层工作的命令。 在此基础上,构建最终用户通常与之交互的瓷器命令,例如签出,分支,提交等。类似地,JGit也具有两层。 命令API紧密模拟Git命令行。 对于每个Git动词(提交,分支,签出等),在org.eclipse.jgit.api包中都有一个对应的JGit命令。

    带您来到JGit的用例使您很可能也将与管道层联系起来。 例如,RevWalk使您可以评估提交并在包含提交元数据的RevCommit中表示它们。 然后可以使用TreeWalk列出提交中的文件,最后ObjectLoader可以帮助您读取特定的修订版。

    那里还有什么

    虽然大多数用户都在寻找核心库,但JGit提供了更多功能。 以下是核心库的附件列表:

    • org.eclipse.jgit.pgm是一个自包含的命令行可执行文件,其中包含本机git提供的大多数命令。
    • org.eclipse.jgit.ui jar中有一些用于AWT和Swing的帮助程序类,以帮助进行用户/密码身份验证呈现提交图
    • 还可以通过org.eclipse.jgit.ant jar获得一些Ant任务 (添加,签出,克隆和初始化)。
    • 常见的存档格式可以在org.eclipse.jgit.archive中找到。 可以使用ArchiveCommand注册它们,以不同格式归档某个提交的内容。
    • 最后但并非最不重要的一点是,org.eclipse.jgit.http.server提供了一个Servlet,用于处理HTTP上的存储库访问

    设置完成后,就可以开始探索JGit API。 文档相当基础,但是有大量测试。 如果您想学习如何使用某些JGit API,它们是一个很好的资源。 然后是Stackoverflow, JGit表单和一个有用的社区。

    参考:我们的JCG合作伙伴 Rudiger Herrmann在Code Affine博客上对JGit源 代码的介绍

    翻译自: https://www.javacodegeeks.com/2013/11/an-introduction-to-the-jgit-sources.html

    jgit

    展开全文
  • jgit_JGit身份验证说明

    2020-06-18 17:05:52
    jgit JGit中的身份验证与本地Git大致相同。 支持SSH和HTTP(S)等常用协议及其身份验证方法。 本文总结了如何使用JGit身份验证API安全地访问远程Git存储库。 尽管本文中的示例使用CloneCommand,但是可以将所描述...

    jgit

    JGit中的身份验证与本地Git大致相同。 支持SSH和HTTP(S)等常用协议及其身份验证方法。 本文总结了如何使用JGit身份验证API安全地访问远程Git存储库。

    尽管本文中的示例使用CloneCommand,但是可以将所描述的技术应用于连接到远程存储库的所有类,例如FetchCommand,PushCommand,LsRemoteCommand等。所有这些命令都有一个公共基类-TransportCommand-提供了所讨论的方法这里。

    HTTP(S)– https://example.com/repo.git

    通过HTTP和HTTPS进行身份验证非常简单。 当命令请求身份验证凭据时,将使用CredentialsProvider的实现返回身份验证凭据。 可以通过setCredentialsProvider()指定用于特定命令的CredentialsProvider。

    例如,以下代码通过HTTPS克隆存储库,并使用用户名和密码进行身份验证。

    CloneCommand cloneCommand = Git.cloneRepository();
    cloneCommand.setURI( "https://example.com/repo.git" );
    cloneCommand.setCredentialsProvider( new UsernamePasswordCredentialsProvider( "user", "password" ) );

    UsernamePasswordCredentialsProvider是JGit随附的CredentialsProvider的实现,并使用给定的用户名和密码进行身份验证。

    另外,JGit(3.5版和更高版本)也可以从用户的.netrc文件中读取凭据。 NetRCCredentialsProvider使用文件中的第一个机器条目进行身份验证。

    尽管不建议通过不安全的连接发送凭据,但是所描述的方法也适用于纯HTTP,例如http://example.com/repo.git。

    带有公钥的SSH – ssh://user@example.com/repo.git

    JGit委托创建和销毁与抽象SshSessionFactory的SSH连接。 要将公共密钥身份验证用于SSH连接,必须为执行的命令指定这样的会话工厂。

    使用setTransportConfigCallback(),可以指定TransportConfigCallback接口以拦截连接过程。 建立连接之前,将调用唯一的方法configure()。 传递给它一个传输类型的参数,该参数将用于在本地和远程存储库之间复制对象。 对于每个协议,都有一个不同的Transport子类来处理该协议的各个详细信息。

    如下所示,该回调可用于在使用前立即配置Transport实例:

    SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
      @Override
      protected void configure( Host host, Session session ) {
        // do nothing
      }
    };
    CloneCommand cloneCommand = Git.cloneRepository();
    cloneCommand.setURI( "ssh://user@example.com/repo.git" );
    cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {
      @Override
      public void configure( Transport transport ) {
        SshTransport sshTransport = ( SshTransport )transport;
        sshTransport.setSshSessionFactory( sshSessionFactory );
      }
    } );

    JGit提供了一个抽象的JSchConfigSessionFactory,它使用JSch建立SSH连接,并要求覆盖它的configure()。 因为在最简单的情况下没有任何要配置的内容,所以上面的示例只是覆盖了使代码编译的方法。

    JSchConfigSessionFactory大多数与本机Git使用的SSH实现OpenSSH兼容。 它从用户的.ssh目录中的默认主机(身份,id_rsa和id_dsa)的默认位置加载已知主机和私钥。

    如果您的私钥文件的名称不同或位于其他位置,则建议覆盖createDefaultJSch()。 调用基本方法后,可以像这样添加自定义私钥:

    @Override
    protected JSch createDefaultJSch( FS fs ) throws JSchException {
      JSch defaultJSch = super.createDefaultJSch( fs );
      defaultJSch.addIdentity( "/path/to/private_key" )
      return defaultJSch;
    }

    在此示例中,添加了来自自定义文件位置的私钥。 如果您查看JSch JavaDoc ,将会发现更多重载的addIdentity()方法。

    为了完整起见,我应该提到还有一个全球会话工厂。 可以通过SshSessionFactory.get / setInstance()获取和更改它,并且如果没有为命令配置特定的shSessionFactory,它将用作默认值。 但是,我建议不要使用它。 除了使编写独立的测试变得更加困难之外,您的控件之外可能还有一些代码会更改全局会话工厂。

    SSH和密码– ssh://user@example.com/repo.git

    与通过公用密钥使用SSH一样,必须指定SshSessionFactory以使用受密码保护的SSH连接。 但是这次,会话工厂的configure()方法是有目的的。

    SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
      @Override
      protected void configure( Host host, Session session ) {
        session.setPassword( "password" );
      }
    } );
    
    CloneCommand cloneCommand = Git.cloneRepository();
    cloneCommand.setURI( "ssh://user@example.com/repo.git" );
    cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {
      @Override
      public void configure( Transport transport ) {
        SshTransport sshTransport = ( SshTransport )transport;
        sshTransport.setSshSessionFactory( sshSessionFactory );
      }
    } );

    JSch会话表示与SSH服务器的连接,在第4行中,设置了当前会话的密码。 其余代码与用于通过SSH与公共密钥身份验证进行连接的代码相同。

    使用哪种身份验证方法?

    此处讨论的某些身份验证方法也可以组合使用。 例如,在尝试通过带有公共密钥的SSH连接到远程存储库时设置凭据提供者不会有任何危害。 但是,您通常希望事先知道给定的存储库URL将使用哪种传输。

    为了确定这一点,可以使用TransportProtocol的canHandle()方法。 如果协议可以处理给定的URL,则返回true,否则返回false。 可以从Transport.getTransportProtocols()获得所有已注册TransportProtocol的列表。 一旦知道了协议,就可以选择适当的身份验证方法。

    验证@ GitHub

    GitHub支持多种协议和身份验证方法,但肯定不是所有可能的组合。 例如,一个常见的错误是尝试将SSH与密码验证一起使用。 但是不支持此组合-仅支持带公钥的SSH。

    GitHub提供的协议的比较列出了支持的内容和不支持的内容。 总结一下,有:

    • Plain Git(例如git://github.com/user/repo.git):传输未加密,服务器未通过验证。
    • HTTPS(例如https://github.com/user/repo.git):实际上可在任何地方使用。 使用密码身份验证进行推送,但允许匿名获取和克隆。
    • SSH(例如ssh://git@github.com:user / repo.git):使用公钥身份验证,也用于获取和克隆。

    结束JGit身份验证

    虽然我发现身份验证功能在JGit API上散布了很多,但它们可以完成任务。 此处给出的食谱有望为您提供必要的基础知识,以验证JGit中的连接,并且隐藏API的复杂性可以视为练习干净代码的练习!

    如果您有困难或问题,请随时发表评论或向友好而乐于助人的JGit社区寻求帮助。

    翻译自: https://www.javacodegeeks.com/2014/12/jgit-authentication-explained.html

    jgit

    展开全文
  • JGit操作

    2020-11-25 16:47:07
    import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory;...import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; import org.eclip.
  • JGit入门

    2020-04-25 11:08:05
    如果您想知道如何在JGit中执行诸如git init , git checkout等基本的Git命令,请继续阅读。 本教程概述了JGit中最常用的git命令及其对应的命令。 它逐步执行以下步骤:创建存储库,从远程获取内容,向历史记录添加...
  • JGit使用

    2019-12-08 21:15:22
    pom依赖 <dependency> ...org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit</artifactId> <version>3.5.0.201409260305-r</version> </depe...
  • jgit-cookbook, 提供 JGit Java Git实现的示例和代码 Fragment jgit食谱 提供 JGit的Java Git实现示例和代码 Fragment 。JGit框架丰富多样,它有两层,一个低级的插件 api,以及一个高级别的系列的命令,比如 ...
  • JGit Authentication JGit验证机制

    千次阅读 2016-11-10 18:52:27
    验证机制在JGit中大部分与本地git相同。普遍使用SSH协议和HTTP(S)协议和他们所支持的验证方法。 这篇文章总结了如何使用JGit的验证API去安全连接远程GIT库。 虽然在下面的例子中使用的是CloneCommand方法,但是它...
  • jgit-cookbook 提供有关 Java Git实现的示例和代码段。 JGit框架丰富多样,它有两层,一个低级的api和一个较高级的瓷器命令集。 首先,这可能有点令人生畏,因为有很多类,其中有些与大多数任务无关。 该项目试图...
  • upgrade jgit library

    2020-12-29 08:53:57
    <div><p>Currently using jgit:3.6.2.201501210735 whereas maven central already has available jgit:4.4.0.201605250940-rc1</p><p>该提问来源于开源项目:sheimi/SGit</p></div>
  • jgit使用 JGit是一个轻量级的纯Java库,实现了Git版本控制系统。 您可以使用Java语言执行很多操作,例如创建或克隆Git存储库,创建分支,进行提交,重新设置基础或标记,您可以看到 此仓库了解如何使用JGit以及...
  • Add JGit repository

    2020-12-09 09:35:22
    <div><p>Now repo.jenkins-ci.org and central do not have the past JGit packages. git-plugin needs it. <p>So add JGit official repository until git-plugin supports the latest one.</p><p>该提问来源于开源...
  • jgit jar包

    2016-11-08 15:16:26
    org.eclipse.jgit-4.5.0.201609210915-r.jar 通过java执行git命令
  • 如果你想在一个 Java 程序中使用 Git ,有一个功能齐全的 Git 库,那就是 JGitJGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用。 JGit 项目由 Eclipse 维护,它的主页在 ...
  • 一个Git库仓在 JGit里面表现为Repository类,该类可以看作是这个库的句柄。通过Repository类实例,你可以创建JGit命令以及可以控制配置、参数等。获取Git库仓的引用有很多种方法,看到很多人在这方面有困难,本文...
  • matlab开发-JGit4MATLAB

    2019-08-22 02:56:40
    matlab开发-JGit4MATLAB。jgit4matlab是jgit在matlab中的包装器。它是从matlab命令窗口中使用的。
  • JAVA 使用jgit管理git仓库最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下。JGit是一款pure java的软件包,可以读写git仓库,下面介绍基本使用。引入jgitmaven引入:org.eclipse.jgitorg....
  • Jgit添加更改对应代码仓中文件数据。
  • JGIT报错org.eclipse.jgit.api.errors.JGitInternalException: Exception caught during execution reset command 最近开发运行自动化脚本的平台,使用了JGIT,从git库中获取代码时报错。 调查了一番,发现并不是git...
  • jgit git pull Git存储库在JGit中通过Repository类表示,可以将其视为存储库的句柄。 借助Repository实例,您可以创建JGit命令(通过Git工厂类),访问配置设置,解析引用等。 有几种方法可以获取存储库引用,...
  • silly-jgit.zip

    2019-07-15 11:27:18
    silly-jgit 是 Git 核心库的纯 Java 实现。 标签:silly
  • Windows下使用JGIT操作git,但是使用下面的API始终无法添加文件到index,仔细查看JGIT API才发现端倪 Git.open(gitHome).add().addFilepattern(filePattern).call(); filePattern使用相对路径 filePattern使用"/...
  • 我想知道如何使用jgit使用指定的ssh密钥文件连接到github(即不在〜/ .ssh /中).不幸的是,我不确定如何正确使用JschConfigSessionFactory.我尝试创建一个与本文中的设置类似的设置:Using Keys with JGit to Access a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 751
精华内容 300
关键字:

jgit