ProcessBuilder con el command GIT no da resultado

Intento utilizar Process Builder para ejecutar un command git. Pero parece que no funciona ningún command.

git log me da el resultado correcto.

git shortlog -s pero termina en un TimeOut!

¡Ambos commands ejecutados en un terminal proporcionan el resultado correcto! He probado en Win y Mac.

¿Alguien tiene alguna idea de cómo puedo depurar esto o dónde está mi error?

O tal vez una solución diferente? El objective es leer el committer a un file específico en un repository de git.

El hecho de que el command Git es git shortlog -s -p FeilePath ?

Mi código de testing:

  @Test public void testCommandListDir() { File execDir = new File("./"); String returnValue = ""; try { returnValue = runCommand(execDir, 10, TimeUnit.SECONDS, "git", "log"); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } assertTrue(returnValue.contains("+ try and error for git shortlog")); } @Test public void testCommandGitShortlog() { File execDir = new File("./"); String returnValue = ""; try { returnValue = runCommand(execDir, 10, TimeUnit.SECONDS, "git", "shortlog", "-s"); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } assertTrue(returnValue.equals("")); } public static String runCommand(File directory, long timeout, TimeUnit unit, String... command) throws IOException, InterruptedException { StringBuilder sb = new StringBuilder(); ProcessBuilder pb = new ProcessBuilder(command) .networkingirectErrorStream(true).directory(directory); Process p = pb.start(); InputStream is = p.getInputStream(); InputStream es = p.getErrorStream(); BuffenetworkingReader br = new BuffenetworkingReader(new InputStreamReader(is)); BuffenetworkingReader bre = new BuffenetworkingReader(new InputStreamReader(es)); String in; boolean timeOut = false; if (!p.waitFor(timeout, unit)) { //timeout - kill the process. p.destroy(); // consider using destroyForcibly instead timeOut = true; } if (timeOut) { //write time out msg sb.append("RunCommand time out! after " + timeout + " " + unit.toString() + "\n"); sb.append(" directory: " + directory.getAbsolutePath() + "\n"); sb.append(" command: " + command + "\n"); } else { while ((in = br.readLine()) != null) { sb.append(in + "\n"); } while ((in = bre.readLine()) != null) { sb.append(in + "\n"); } } return sb.toString(); } 

Si entendí correctamente, estás intentando que tu objective sea git blame <filepath> .

Sugeriría la API de Git para Java (JGit). En este libro de cocina , hay varios ejemplos sobre cómo comenzar.

Más específicamente, puede culpar a un file dado en una confirmación determinada, como esta:

 private BlameResult blameCommit(String path, RevCommit commitToBlame) throws GitAPIException { BlameCommand blamer = new BlameCommand(<yourRepository>); ObjectId commitToBlameID = commitToBlame.getId(); blamer.setStartCommit(commitToBlameID); blamer.setFilePath(path); return blamer.call(); } 

… o recursivamente en un range de time dado, como este:

 public List<Blame> recuriveBlame(String path, RevCommit beginRevision, RevCommit endRevision) throws IOException, GitAPIException { if (path == null || beginRevision == null || endRevision == null) { return null; } List<Blame> result = new ArrayList<Blame>(); try (RevWalk rw = new RevWalk(this.repo)) { rw.markStart(rw.parseCommit(this.beginRevision)); rw.markUninteresting(rw.parseCommit(this.endRevision)); for (RevCommit curr; (curr = rw.next()) != null;){ result.add(new Blame(curr, blameCommit(path, curr))); } } return result; } 

… y get el committer de una línea determinada de file dado en una confirmación determinada, como esta :

 public void printCommitter(Repository repo, ObjectID commitID, String filename){ int lines = countFiles(repos, commitID, filename); for (int i = 0; i < lines; i++) { PersonIdent committer = blame.getSourceCommitter(i); System.out.println("Committer of the line: " + i + ": " + committer.getName()); } } 

ps: tenga en count que puede necesitar hacer pequeños cambios para ejecutar este código. Por ejemplo, countFiles(...) está aquí .