Wie bekomme ich die Dateiliste für ein Commit mit JGit?

Ich habe an einem Java-basierten Produkt gearbeitet, für das die Git-functionen integriert werden. Mit einer der Git-functionen habe ich über das Staging 10+ Dateien in das Git-Repository eingefügt und anschließend in einem einzigen Commit übergeben.

Ist das Gegenteil des obigen processes möglich? Ie Suche nach der Liste der Dateien, die als Teil eines Commits festgelegt wurden.

Ich habe das Commit mit Hilfe des git.log() ausgeführt, aber ich bin mir nicht sicher, wie ich die Dateiliste für das Commit bekommen soll.

Beispielcode:

 Git git = (...); Iterable logs = git.log().call(); for(RevCommit commit : logs) { String commitID = commit.getName(); if(commitID != null && !commitID.isEmpty()) { TableItem item = new TableItem(table, SWT.None); item.setText(commitID); // Here I want to get the file list for the commit object } } 

Jedes Commit zeigt auf einen Baum , der alle Dateien angibt, aus denen das Commit besteht.

Beachten Sie, dass dies nicht nur die Dateien einschließt, die mit diesem bestimmten Commit hinzugefügt, geändert oder entfernt wurden, sondern alle Dateien, die in dieser Revision enthalten sind.

Um über einen Baum zu iterieren, können Sie JGits TreeWalk :

 TreeWalk treeWalk = new TreeWalk( repository ); treeWalk.reset( commit.getId() ); while( treeWalk.next() ) { String path = treeWalk.getPathString(); // ... } treeWalk.close(); 

Wenn Sie nur an den Änderungen interessiert sind, die mit einem bestimmten Commit aufgezeichnet wurden, siehe hier: Erstellen von Diffs mit JGit oder hier: Datei diff gegen den letzten Commit mit JGit

Ich habe ein wenig von dem Code in diesem Link bearbeitet. Sie können versuchen, den folgenden Code zu verwenden.

 public void commitHistory(Git git) throws NoHeadException, GitAPIException, IncorrectObjectTypeException, CorruptObjectException, IOException, UnirestException { Iterable logs = git.log().call(); int k = 0; for (RevCommit commit : logs) { String commitID = commit.getName(); if (commitID != null && !commitID.isEmpty()) { LogCommand logs2 = git.log().all(); Repository repository = logs2.getRepository(); tw = new TreeWalk(repository); tw.setRecursive(true); RevCommit commitToCheck = commit; tw.addTree(commitToCheck.getTree()); for (RevCommit parent : commitToCheck.getParents()) { tw.addTree(parent.getTree()); } while (tw.next()) { int similarParents = 0; for (int i = 1; i < tw.getTreeCount(); i++) if (tw.getFileMode(i) == tw.getFileMode(0) && tw.getObjectId(0).equals(tw.getObjectId(i))) similarParents++; if (similarParents == 0) System.out.println("File names: " + fileName); } } } } 

Sie können versuchen mit:

  git diff --stat --name-only ${hash} ${hash}~1 

Oder um Unterschiede in größeren Bereichen zu sehen:

  git diff --stat --name-only ${hash1} ${hash2}