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 File( "/home/user" ) );
repositoryBuilder.findGitDir( new File( "/home/user/git/foo/bar" ) );
如果找到存储库目录或到达文件系统的根目录,则搜索结束。 getGitDir()可用于获取搜索结果并返回找到的git目录;如果未找到,则返回null。
可以通过添加一个或多个上限目录来限制搜索。 如果在遍历目录层次结构时已到达其中之一,则搜索结束。
备选:Git.open()
如果发现FileRepositoryBuilder使用起来不方便,则还有一个简写:Git.open()。
Git git = Git.open( new File( "/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