2011-12-15 4 views
7

Desidero ottenere un elenco di file modificati/aggiunti/eliminati tra la revisione XXXXXX e HEAD. Questo è quello che ho finora:Come faccio a fare l'equivalente di "git diff --name-status" con jgit?

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 
} 

E 'questo il modo giusto per andare a questo proposito e, se sì, come faccio agli alberi richiesto per git.diff()?

+0

Questa è una grande domanda anche se l'OP ha chiesto specificamente solo --name-status, perché applica t o tutte le domande di tipo jgit.Git.diff(), per le quali gli esempi IMHO sono scarsi e la documentazione API obliqua. Quindi grazie! E grazie per le risposte @ [Kevin Sawicki] (http://stackoverflow.com/users/687965/kevin-sawicki) e @ [ktoso] (http://stackoverflow.com/users/111024/ktoso)! –

risposta

9

È possibile ottenere l'id albero per la testa e l'hash chiamando:

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

e per l'id di revisione:

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

Una volta che avete gli ID degli alberi è possibile creare le iteratori albero e ottieni le differenze:

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

Grazie! Gli darò un vortice stasera. – Erik

+0

ha funzionato perfettamente. Grazie ancora! – Erik

+2

Ho anche trovato i test per DiffCommand davvero utili mentre implementavo le cose attorno a diffs - quindi ho pensato di condividere il link :-) http://git.eclipse.org/c/jgit/jgit.git/tree/ org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DiffCommandTest.java –