2011-12-15 38 views
7

我想获取修订版XXXXXX和HEAD之间已更改/添加/删除的文件列表。这是我到目前为止有:如何用jgit做“git diff --name-status”的等价物?

String oldHash = "a97e5553e37a25bd1a3c99eab303145baed08dbd"; 
Git git = Git.open(new File("/tmp/jgit")); 
Repository repository = git.getRepository(); 
ObjectId old = repository.resolve(oldHash); 
ObjectId head = repository.resolve("HEAD"); 

// how do i get the trees from the obj. id? 
List<<DiffEntry> diffs = git.diff().setNewTree(null).setOldTree(null).call(); 

for(DiffEntry diff : diffs) { 
    // do stuff 
} 

这是去了解它,如果是正确的方式,我该如何要求git.diff树()?

+0

这是一个很好的问题,即使OP专门只询问 - 名称状态,因为它适用于t o所有的jgit.Git.diff()类型的问题,恕我直言,这些例子很少,而且API文档是倾斜的。那谢谢啦!感谢您的答案@ [Kevin Sawicki](http://stackoverflow.com/users/687965/kevin-sawicki)和@ [ktoso](http://stackoverflow.com/users/111024/ktoso)! – 2013-05-09 18:39:46

回答

9

您可以通过调用get树ID为HEAD和散列:

ObjectId head = repository.resolve("HEAD^{tree}"); 

和修订ID:

ObjectId old = repository.resolve(oldHash + "^{tree}"); 

一旦你的树ID,您就可以创建树迭代器并得到差异:

ObjectReader reader = repository.newObjectReader(); 
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser(); 
oldTreeIter.reset(reader, oldId); 
CanonicalTreeParser newTreeIter = new CanonicalTreeParser(); 
newTreeIter.reset(reader, headId); 
List<DiffEntry> diffs= git.diff() 
         .setNewTree(newTreeIter) 
         .setOldTree(oldTreeIter) 
         .call(); 
+0

谢谢!今晚我会给它一个旋风。 – Erik 2011-12-20 08:04:20