是否有等同于 git rev-parse --short 的 JGit 方法?

Is there a JGit method equivalent to git rev-parse --short?

JGit 是否包含 git rev-parse --short 的实现?我在仔细阅读文档时找不到。

在 JGit 中没有直接等同于 git rev-parse

但是,JGit 提供了 API 可能有助于实现 rev-parse 的功能。

  • ObjectId::isId() 确定给定的字符串是否表示 SHA-1
  • ObjectId::fromString() 从字符串
  • 创建一个 ObjectId

要缩短给定的对象 ID,请使用 ObjectId::abbreviate()

以下示例缩写了给定的 SHA-1:

ObjectId objectId = ObjectId.fromString( "fb808b5b01cdfaedda0bd1d304c7115ce959b286" );
AbbreviatedObjectId abbreviatedId = objectId.abbreviate( 7 );  // returns fb808b5

请注意,上述方法独立于存储库运行,因此无法检测不明确的对象 ID 或验证给定的 ID 是否存在于存储库中,或者它是否具有预期的类型(git rev-parse --verify 会做的事情).

可以使用存储库验证 id Repository::resolve。如果无法解析字符串,该方法接受 fb808b5^{commit} 和 returns 和 ObjectIdnull 等表达式。如果存储库包含多个匹配项,则会抛出 AmbiguousObjectException。请参阅 JavaDoc 以获取支持的表达式列表:http://download.eclipse.org/jgit/site/4.2.0-SNAPSHOT/apidocs/org/eclipse/jgit/lib/Repository.html#resolve(java.lang.String)

请注意,如果指定了对象类型,则会抛出 IncorrectObjectTypeException,但找到的修订与给定类型不匹配。

只是为上面提到的 @Rüdiger Herrmann 做一个简单的例子

// git rev-parse HEAD
git.getRepository().exactRef("refs/heads/master").getObjectId().name()

// git rev-parse --short HEAD
git.getRepository().exactRef("refs/heads/master").getObjectId().abbreviate(7).name()