jgit git pull_如何使用JGit访问Git存储库

jgit git pull

Git存储库在JGit中通过Repository类表示,可以将其视为存储库的句柄。 借助Repository实例,您可以创建JGit命令(通过Git工厂类),访问配置设置,解析引用等。

有几种方法可以获取存储库引用,并且由于我已经看到人们在这里和那里遇到麻烦,因此本文总结了如何使用JGit访问Git存储库。

存储库和构建器

Repository类是抽象的,以允许使用不同的存储后端实现。 例如,有一个用于测试和实验的InMemoryRepository。 但当然,最常用的是FileRepository,它表示本地文件系统中的存储库。 因为实际的实现被认为是内部的,所以每个存储库实现都有一个对应的存储库生成器,应使用它们来创建其实例。

因此, FileRepositoryBuilder是创建一个FileRepository文件的推荐方式。 由于历史原因,还有一个RepositoryBuilder的功能完全相同,但是将在下一个主要版本更新中删除。

在根据需要配置了存储库生成器后,调用其build()方法以创建存储库。

FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
repositoryBuilder.setMustExist( true );
repositoryBuilder.setGitDir( ... );
Repository repository = repositoryBuilder.build();

出于布局原因,我将方法调用分别放在一行上,但是FileRepositoryBuilder还实现了流利的接口,以便可以链接方法调用。

此处讨论的所有方法仅适用于本地存储库。 Git是一个分布式版本控制系统,因此并非旨在直接操作远程存储库。

为了操作远程存储库,您必须先对其进行克隆。 现在,您可以对本地副本进行修改,例如提交新文件或更改过的文件,创建分支或标签等。要使更改与远程存储库同步,您首先必须从远程集成(也称为获取)更改(如果有)然后最终推动您的本地更改。

更喜欢setGitDir()

在JGit中,通过目录标识基于文件的存储库。 但是,可能有两个目录似乎适合标识存储库:当前检出的修订版驻留的工作目录和保存对象数据库和元数据(例如分支,标签等)的git目录。

尽管FileRepositoryBuilder具有setGitDir()和setWorkTree()方法,但我建议始终使用setGitDir(),因为:

  • 默认情况下,git目录是工作目录的直接子目录,但是可以通过环境变量或配置设置来覆盖它。
  • 然后有一些根本没有工作目录的裸仓库。

这是存储库吗?

无论存储库是否存在,FileRepositoryBuilder的build()方法都会返回一个存储库。 即使给定目录不存在,也会返回一个实例。

我发现了两种测试给定目录是否指向现有存储库的方法。 通过调用setMustExist(true),可以将FileRepositoryBuilder配置为仅构建现有存储库。 一旦必须存在标志被打开,如果找不到存储库,build()将抛出RepositoryNotFoundException 。 附带说明,此行为是未记录的。 JavaDoc中这可能只是一个过时,我怀疑这种行为是否会改变,但是仍然无法保证它是API的一部分。

或者,您可以测试返回的存储库的对象数据库是否实际存在。

Repository repository = repositoryBuilder.build();
if( repository.getObjectDatabase().exists() ) {
  ...
}

顾名思义,如果存在对象数据库,则ObjectDatabase.exists()返回true,否则返回false。

绕道而行:findGitDir()

存储库构建器还提供了findGitDir()方法,该方法可用于从给定目录开始向上搜索其父层次结构来搜索存储库。

FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
repositoryBuilder.addCeilingDirectory( new F‌ile( "/home/user" ) );
repositoryBuilder.findGitDir( new F‌ile( "/home/user/git/foo/bar" ) );

如果找到存储库目录或到达文件系统的根目录,则搜索结束。 getGitDir()可用于获取搜索结果并返回找到的git目录;如果未找到,则返回null。

可以通过添加一个或多个上限目录来限制搜索。 如果在遍历目录层次结构时已到达其中之一,则搜索结束。

备选:Git.open()

如果发现FileRepositoryBuilder使用起来不方便,则还有一个简写:Git.open()。

Git git = Git.open( new F‌ile( "/path/to/repo/.git" ) );

该方法需要一个File参数,该参数指示存储库所在的目录。 该目录可以指向工作目录或git目录。 同样,我建议在这里使用git目录。

如果给定目录不存在或不包含存储库,则将引发RepositoryNotFoundException。 成功后,将返回类Git的实例,该实例可用于访问存储库(git.getRepository())和创建git命令。

使用JGit访问Git存储库的多种方法

虽然Git.open()不错而又简短,但FileRepositoryBuilder可以为您提供更多控制权和可靠的方式来确定存储库是否存在。 您是喜欢第一个还是后者,可能取决于您的用例。 请记住不要直接使用FileRepository构造函数,因为它可能会消失或更改其行为,恕不另行通知。

翻译自: https://www.javacodegeeks.com/2014/09/how-to-access-a-git-repository-with-jgit.html

jgit git pull

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值