使用JGit列出与给定标记关联的提交
我需要创建一个历史文件,详细说明所有标签和每个标签的所有提交。
我试图在存储库对象上调用getTags()
并使用那些对象id,但它们不是提交id。
我还尝试在存储库上使用getAllRefsByPeeledObjectId()
,这确实带回了提交但我无法将它们与标记相关联。
有任何想法吗?
列出所有标签:
List call = new Git(repository).tagList().call(); for (Ref ref : call) { System.out.println("Tag: " + ref + " " + ref.getName() + " " + ref.getObjectId().getName()); }
列表提交基于标记:
我将使用基于tag-name的log-command和Rüdiger所指出的去皮魔法:
LogCommand log = new Git(repository).log(); Ref peeledRef = repository.peel(ref); if(peeledRef.getPeeledObjectId() != null) { log.add(peeledRef.getPeeledObjectId()); } else { log.add(ref.getObjectId()); } Iterable logs = log.call(); for (RevCommit rev : logs) { System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); }
有关相关示例,请参阅我的jgit-cookbook 。
要获取标记列表,您可以使用Repository#getTags()
或ListTagCommand
。
Git中有注释和未注释的标签。 虽然未注释的标签直接指向它们被放置的提交,但带注释的标签指向一个git对象 ,该对象包含其他元数据(如消息) – commit-id。
下面的学习测试说明了这一点:
public class TagLearningTest { @Rule public final TemporaryFolder tempFolder = new TemporaryFolder(); private Git git; @Test public void testUnannotatedTag() throws Exception { RevCommit commit = git.commit().setMessage( "Tag Me!" ).call(); Ref tagRef = git.tag().setAnnotated( false ).setName( "Unannotated_Tag" ).call(); assertEquals( commit.getId(), tagRef.getObjectId() ); assertNull( git.getRepository().peel( tagRef ).getPeeledObjectId() ); } @Test public void testAnnotatedTag() throws Exception { RevCommit commit = git.commit().setMessage( "Tag Me!" ).call(); Ref tagRef = git.tag().setAnnotated( true ).setName( "Annotated_Tag" ).call(); assertEquals( commit, git.getRepository().peel( tagRef ).getPeeledObjectId() ); ObjectReader objectReader = git.getRepository().newObjectReader(); ObjectLoader objectLoader = objectReader.open( tagRef.getObjectId() ); RevTag tag = RevTag.parse( objectLoader.getBytes() ); objectReader.release(); assertEquals( commit.getId(), tag.getObject() ); } @Before public void setUp() throws GitAPIException { git = Git.init().setDirectory( tempFolder.getRoot() ).call(); } }
在JGit中,带注释的标签由RevTag
表示,该标签存储在标签ref指向的id下。
要告诉另一个表单,可以剥离 ref,然后测试它的getPeeledObjectId()
返回非null。
Ref peeledRef = git.getRepository().peel( tagRef ); boolean annotatedTag = peeledRef.getPeeledObjectId() != null;
去皮对象id是指向创建带注释标记的提交的对象。