Einfaches Auffinden von Daten in Exportlisten mittels Git/JGit
Mar 30, 2016 • Alexander Bischof •
Heutzutage dreht es sich in IT-Systemen nur noch um Daten. Wo kommen Sie her, wie und wo werden sie gespeichert, wo angezeigt und welche
nachgelagerten Prozessschritte existieren? Früher oder später werden sie jedoch exportiert und an dieser Stelle kann die Protokollierung
und Nachvollziehbarkeit eine große Rolle spielen (z.B. hinsichtlich Datenschutz). Dabei ist zu meist weniger relevant wer den Export durchgeführt hat,
sondern eher In welchen Exporten war ein bestimmter Datensatz drin bzw. nicht drin?.
Dieser Artikel zeigt einen einfachen und meiner Meinung nach eleganten Weg, wie das mittels Git und Java/JGit (hier JGit)
erreicht werden kann.
Pure Git
Zunächst möchte ich die reine Kommandozeilen Variante vorstellen, wobei es an dieser Stelle nicht den richtigen Weg gibt, sondern man zwischen verschiedenen
Varianten wählen kann (z.B. git log, git grep, git rev-list). Der wohl einfachste Weg ist über git rev-list mit dem folgenden Kommando:
Mittels obigen Snippet wird in allen Commits nach dem regulären Ausdruck^5555$ gesucht und die entsprechenden Commits
ausgegeben. Diese könnte man nun sogar über weitere Skripte verarbeiten, um entsprechende Reports draus zu bauen.
Sehr interessant in diesem Kontext sind auch weitere Parameter mit dem man die Commit-Filterung erweitern kann, wie z.B.:
–skip
–max-count
–date
JGit
Nun kam ich an den Punkt, wo ich obige Funktionalität in Java verwenden wollte und fand folgenden
Stackoverflow-Artikel, der ein
git grep mittels JGit beinhaltet.
Im folgenden Code-Snippet wurde der Code aus dem Artikel leicht verändert (z.B. Java 8), so dass man direkt an die Commit-Information
herankommt und diese auch zurückgeliefert werden.
Beispiel
Als kleines konsturiertes Beispiel zum Testen nehme man an, dass ein System Export-Dateien mit Nummern erzeugt und man möchte nun wissen
in welchen Exporten die Zahl 5555 drin war.
Dazu habe ich eine JUnit4-Bootstrap-Rule gebaut, die mir ein paar Testdaten erzeugt und jeweils commited.
Commit 1: Zahlen von 0-100000
Commit 2: Zahlen von 0-110000 ohne 5000-5999
Commit 3: Zahlen von 10000-100000
Commit 4: Zahlen von 5000-6000
Commit 5: Zahlen von 0-1
Über den regulären Ausdruck ^5555$ werden nun alle Commits durchlaufen und nach dem Ausdruck durchforstet.
Die entsprechenden Source findet ihr in meinem Github-Repo