Cómo mostrar cambios entre confirmaciones con JGit

Para obtener el árbol de la cabeza commit, llame

git.getRepository().resolve( "HEAD^{tree}" )

y para obtener el árbol del padre del commit HEAD, llame

git.getRepository().resolve( "HEAD~1^{tree}" )

Busque 'Git caret and tilde' si está interesado en más detalles.

Para resumir, aquí va un fragmento que calcula la diferencia de dos confirmaciones:

File file = new File( git.getRepository().getWorkTree(), "file.txt" );
writeFile( file, "first version" );
RevCommit newCommit = commitChanges();
writeFile( file, "second version" );
RevCommit oldCommit = commitChanges();

ObjectReader reader = git.getRepository().newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
ObjectId oldTree = git.getRepository().resolve( "HEAD^{tree}" ); // equals newCommit.getTree()
oldTreeIter.reset( reader, oldTree );
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
ObjectId newTree = git.getRepository().resolve( "HEAD~1^{tree}" ); // equals oldCommit.getTree()
newTreeIter.reset( reader, newTree );

DiffFormatter df = new DiffFormatter( new ByteArrayOutputStream() ); // use NullOutputStream.INSTANCE if you don't need the diff output
df.setRepository( git.getRepository() );
List<DiffEntry> entries = df.scan( oldTreeIter, newTreeIter );

for( DiffEntry entry : entries ) {
  System.out.println( entry );
}

private RevCommit commitChanges() throws GitAPIException {
  git.add().addFilepattern( "." ).call();
  return git.commit().setMessage( "commit message" ).call();
}

private static void writeFile( File file, String content ) throws IOException {
  FileOutputStream outputStream = new FileOutputStream( file );
  outputStream.write( content.getBytes( "UTF-8" ) );
  outputStream.close();
}

Para obtener más información sobre cómo mostrar cambios entre confirmaciones, puede leer esta discusión en profundidad de las API de diferencias de JGit que se pueden encontrar aquí: http://www.codeaffine.com/2016/06/16/jgit-diff/

Respuesta 1

¿Podría decirme por favor? ¿Es una práctica normal escribir un método (ejemplo: Prueba JUnit) que arroje una Excepción, por ejemplo: clase A {public String f (int param) lanza Exception {if (...

Tengo un extraño error que aparece cada vez que quiero implementar mi aplicación. Estoy usando IntelliJ IDEA 2016.3. Mi aplicación es una aplicación Java WEB que utiliza JSF, EJB y JPA (Hibernate). Todas las librerías eran ...

Tengo un índice con el nombre de demo y contiene diferentes tipos. Estoy usando la API interna de búsqueda elástica de Java y la API de descanso las dos en mi aplicación. Básicamente quiero hacer esta solicitud curl -...

Estoy escribiendo un código Java en el que necesito convertir un JSONObject a JsonElement. ¿Hay alguna forma de usar el cual pueda convertir un JSONObject (org.json) a JsonElement (com.google.gson)?