不久前,我在寻找Java中的可嵌入分布式版本控制系统,我想我已经在JGit中找到了它,它是git的纯Java实现。但是,示例代码或教程的方式并不多。
如何使用JGit检索某个文件的HEAD版本(就像svn cat
或应该hg cat
做的那样)?
我想这涉及一些rev-tree-walking,并且正在寻找代码示例。
不幸的是,Thilo的答案不适用于最新的JGit API。这是我找到的解决方案:
File repoDir = new File("test-git");
// open the repository
Repository repository = new Repository(repoDir);
// find the HEAD
ObjectId lastCommitId = repository.resolve(Constants.HEAD);
// now we have to get the commit
RevWalk revWalk = new RevWalk(repository);
RevCommit commit = revWalk.parseCommit(lastCommitId);
// and using commit's tree find the path
RevTree tree = commit.getTree();
TreeWalk treeWalk = new TreeWalk(repository);
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
treeWalk.setFilter(PathFilter.create(path));
if (!treeWalk.next()) {
return null;
}
ObjectId objectId = treeWalk.getObjectId(0);
ObjectLoader loader = repository.open(objectId);
// and then one can use either
InputStream in = loader.openStream()
// or
loader.copyTo(out)
我希望它更简单。
谁设计了这个API?
您知道treeWalk.getObjectId(nth)中的第n个值是什么吗?(即,在什么情况下我们将大于0的值传递给treeWalk.getObjectId?)
@DinisCruz
TreeWalk
可以遍历一棵以上的树(通过addTree
多次调用)。在这种情况下,您可以用来getObjectId(N)
从树N中获取对象ID(根据树的不同,ID可能相同或不同)。请参阅creinig的答案,以了解如何通过使用来简化此操作
TreeWalk.forPath
。如何将的输出保存
loader
到变量中?