2014-05-06 3 views
4

J'essaie d'utiliser JGit pour obtenir les différences d'un fichier de la dernière validation aux plus récentes modifications non validées. Comment puis-je faire cela avec JGit? (En utilisant la ligne de commande serait la sortie de git diff HEAD)Fichier diff par rapport au dernier commit avec JGit

Après plusieurs discussions (link1, link2) Je viens avec un morceau de code qui est en mesure de trouver les fichiers qui sont UNCOMMITED, mais je ne peux pas obtenir la différence de les fichiers

Repository db = new FileRepository("/path/to/git"); 
Git git = new Git(db); 

AbstractTreeIterator oldTreeParser = this.prepareTreeParser(db, Constants.HEAD); 

List<DiffEntry> diff = git.diff().setOldTree(oldTreeParser).call(); 

for (DiffEntry entry : diff) { 
    System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId()); 
    DiffFormatter formatter = new DiffFormatter(System.out); 
    formatter.setRepository(db); 
    formatter.format(entry); 

} 

MISE à JOUR

Cette question a été il y a longtemps. Mon existant pour affiche le code non validé. Le code actuel que j'utilise pour prepareTreeParser, dans le cadre de l'affichage de la différence, est:

public void gitDiff() throws Exception { 
    Repository db = new FileRepository("/path/to/git" + DEFAULT_GIT); 
    Git git = new Git(db); 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    DiffFormatter formatter = new DiffFormatter(out); 
    formatter.setRepository(git.getRepository()); 
    AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(), Constants.HEAD); 
    FileTreeIterator workTreeIterator = new FileTreeIterator(git.getRepository()); 
    List<DiffEntry> diffEntries = formatter.scan(commitTreeIterator, workTreeIterator); 

    for(DiffEntry entry : diffEntries) { 
     System.out.println("DIFF Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId()); 
     formatter.format(entry); 
     String diffText = out.toString("UTF-8"); 
     System.out.println(diffText); 
     out.reset(); 
    } 
    git.close(); 
    db.close(); 

    // This code is untested. It is slighting different for the code I am using in production, 
    // but it should be very easy to adapt it for your needs 
} 
private static AbstractTreeIterator prepareTreeParser(Repository repository, String ref) throws Exception { 
    Ref head = repository.getRef(ref); 
    RevWalk walk = new RevWalk(repository); 
    RevCommit commit = walk.parseCommit(head.getObjectId()); 
    RevTree tree = walk.parseTree(commit.getTree().getId()); 

    CanonicalTreeParser oldTreeParser = new CanonicalTreeParser(); 
    ObjectReader oldReader = repository.newObjectReader(); 
    try { 
     oldTreeParser.reset(oldReader, tree.getId()); 
    } finally { 
     oldReader.release(); 
    } 
    return oldTreeParser; 
} 
+0

Le code de la méthode 'this.prepareTreeParser()' est manquant. –

+1

@ PavelLobodinský juste mis à jour avec le code existant que j'utilise pour obtenir le diff – Tk421

Répondre

6

La configuration suivante fonctionne pour moi:

DiffFormatter formatter = new DiffFormatter(System.out); 
formatter.setRepository(git.getRepository()); 
AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(), Constants.HEAD); 
FileTreeIterator workTreeIterator = new FileTreeIterator(git.getRepository()); 
List<DiffEntry> diffEntries = formatter.scan(commitTreeIterator, workTreeIterator); 

for(DiffEntry entry : diffEntries) { 
    System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId()); 
    formatter.format(entry); 
} 

Les modifications non validées sont faits disponibles par voie FileTreeIterator . L'utilisation de formatter.scan() au lieu de DiffCommand a l'avantage que le formateur est configuré correctement pour gérer le FileTreeIterator. Sinon, vous obtiendrez MissingObjectException s lorsque le formateur tente de localiser les modifications de l'arborescence dans le référentiel.

Questions connexes