Ich habe es geschafft, mich mit den Grundlagen der jGit-Datei vertraut zu machen, indem ich mich mit Repos verbinde und die Commit-Nachrichten für die Dateien hinzufüge, festlege und sogar loople.
%Vor%Als nächstes möchte ich in der Lage sein, die gesamte Commit-Nachricht für eine einzelne Datei zu erhalten und dann die einzelne Datei zu einer bestimmten Referenz / einem bestimmten Zeitpunkt zurückzusetzen.
Hier finden Sie die Änderungen eines Commits basierend auf allen übergeordneten Commits
%Vor%(Scala-Code)
Beachten Sie, dass TreeFilter.ANY_DIFF für einen einzelnen Treewalker funktioniert und alle in einem Root-Commit verfügbaren Elemente zurückgibt.
Sie müssten dann über den Baum iterieren, um zu sehen, ob Ihre Datei im gegebenen Delta ist (das ist ziemlich einfach).
%Vor%(cleanPath ist das Pure im Repo-Pfad, geteilt durch '/')
Fügen Sie diesen Code nun in eine RevWalk.next-Schleife ein und Sie erhalten die Commits und Dateien, die durch das Commit geändert wurden.
Sie möchten möglicherweise einen anderen Filter als ANY_DIFF verwenden, da ANY_DIFF wahr ist, wenn sich eine Struktur unterscheidet. Dies ist etwas kontraintuitiv im Falle einer Zusammenführung, bei der sich der Blob im Vergleich zu allen übergeordneten Bäumen nicht geändert hat. Also hier ist der Kern eines ALL_DIFF, der nur Elemente zeigt, die sich von allen übergeordneten Bäumen unterscheiden:
%Vor%(Scala-Code, abgeleitet von AnyDiffFilter)
Also habe ich versucht, charlieboys Lösung zum Laufen zu bringen, und das hat es meistens getan, aber es ist mir im folgenden Fall fehlgeschlagen (vielleicht hat sich seit dem Beitrag etwas in jgit geändert?)
fileA hinzufügen, commit als "commit 1" add fileB, commit als "commit 2"
%Vor% Sowohl commit 1
als auch commit 2
wurden gefunden, wobei ich nur commit 1
erwartet habe.
Meine Lösung war wie folgt:
%Vor%Die Verwendung des LogCommand ist noch einfacher und sieht so aus:
%Vor%Offensichtlich würden Sie auch die Commit-Daten usw. nach Bedarf überprüfen.
Der allgemeine Ansatz von git, den Verlauf einer bestimmten Datei zu finden, besteht darin, das Revisionsdiagramm zu durchlaufen (was Sie gerade tun) und für jedes das Objekt zu testen, auf das sich der betreffende Pfad bezieht (kann ein Blob sein oder ein Baum, um die Historie für einen ganzen Teilbaum zu finden). Also im Wesentlichen als Filter für die Revisionssatzausgabe durch den Revisionswanderer.
Die Jgit-Dokumentation scheint ... spärlich. Aber Sie sollten in der Lage sein, einen RevTree zu erhalten, der jedem RevCommit entspricht, und wenn Sie das unbedingt mit jedem Pfadsegment durchgehen müssen, bis hin zu einer Terminal-Objekt-ID.
araqnid hat Recht, so habe ich eine Liste von Daten erhalten, wobei jedes Datum sich auf das Commit bezieht, das die fragliche Datei enthielt ...
Dann können Sie die Datei von einem bestimmten Commit abrufen, da Sie den Namen der Datei und das Datum des Commits haben, siehe die beiden folgenden Methoden ....
Hinweis: Dieser Code befindet sich in einer .groovy-Klasse, also müssen Sie sicherlich ein wenig für Java ändern.
%Vor%