我需要创建一个历史文件,详细说明所有标签和每个标签的所有提交.
我试图调用getTags()存储库对象并使用那些对象id,但它们不是提交id.
我也试图getAllRefsByPeeledObjectId()在存储库上使用它确实带回了提交但我不能将它们与标签相关联.
有任何想法吗?
列出所有标签:
List<Ref> call = new Git(repository).tagList().call();
for (Ref ref : call) {
System.out.println("Tag: " + ref + " " + ref.getName() + " " + ref.getObjectId().getName());
}
Run Code Online (Sandbox Code Playgroud)
根据标签列出提交:
如Rüdiger所指出的,我将使用基于标签名称的log-command以及如魔术般脱皮的魔术:
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<RevCommit> logs = log.call();
for (RevCommit rev : logs) {
System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */);
}
Run Code Online (Sandbox Code Playgroud)
有关一些相关示例,另请参阅我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
RevTag在 JGit 中,带注释的标签由存储在标签 ref 指向的 id 下的a 表示。
要区分一种形式,您可以剥离引用,然后测试它是否getPeeledObjectId()返回非空。
Ref peeledRef = git.getRepository().peel( tagRef );
boolean annotatedTag = peeledRef.getPeeledObjectId() != null;
Run Code Online (Sandbox Code Playgroud)
剥离的对象 ID 是指向创建带注释标签的提交的 ID。
| 归档时间: |
|
| 查看次数: |
2387 次 |
| 最近记录: |