Git: Vergleich gezippter XML-Dateien

Faluröd

Lieutenant
Registriert
März 2011
Beiträge
574
Hallo! Ich bin auf der Suche nach einer guten Möglichkeit, gezippte XML-Dateien in Git zu vergleichen. Ein Beispiel für solche Dateien sind Word-Dokumente als DOCX. Mein wichtigster Anwendungsfall wären Modelle in Matlab/Simulink. Egal ob Word- oder Simulink-Datei, in beiden Fällen handelt es sich um eine Zip-Datei, welche aus Textdateien im XML-Format besteht.

Da würde mich interessieren, ob es eine einfache Möglichkeit gibt, die in der Datei beinhalteten Texte ähnlich komfortabel in Git zu vergleichen wie normale Textdateien im txt-Format.

Ein manueller Workflow für einen solchen Vergleich wäre:
  • docx/slx-Datei unzippen
  • Alle beinhalteten Dateien als Textdatei öffnen und diese aneinanderhängen
  • Die daraus resultierende Textdatei vergleichen

Also an sich ein überschaubarer Workflow. Lässt sich sowas einem git-diff Befehl vorschalten? Und idealerweise ohne großes Zutun seitens des Nutzers?

Einige Informationen zu involvierten Programmen / Umgebungen:
  • Betriebssystem: Windows
  • Git-Server: Läuft auf GitLab
  • Git: Nutze ich derzeit über die GUI Sourcetree
Die ersten beiden Punkte sind fix, da kann ich nichts ändern. Der dritte Punkt ist bei Bedarf variabel. Wobei es natürlich schön wäre, eine Lösung zu finden, die unabhängig von der verwendeten Software funktioniert.

Hat da einer von euch einen guten Vorschlag?
 
Gezippte XML-Dateien (wie DOCX oder SLX) automatisch entpacken und die enthaltenen XML-Dateien vergleichen erreichst du mit Git's diff- und Merge-Mechanismen, indem du eine eigene Textconv-Filterregel definierst.

Erstelle ein Batch- oder PowerShell-Skript, das die Datei entpackt, XML-Dateien extrahiert und zusammenführt.
z.B. unter C:\git-tools\extract-xml.ps1 speichern

Git so konfigurieren, dass es das Skript für DOCX und SLX verwendet
also für deine deine ~/.gitconfig z.B.
[diff "zipxml"]
textconv = powershell -ExecutionPolicy Bypass -File C:/git-tools/extract-xml.ps1

Lege im Root deines Git-Repos eine Datei namens .gitattributes an
*.docx diff=zipxml
*.slx diff=zipxml

Wenn du nun git diff in deinem Repository ausführst, wird automatisch die docx- oder slx-Datei entpackt, ie enthaltenen XML-Dateien zusammengeführt, ein Git-Diff auf diese zusammengefügten XML-Inhalte durchgeführt. Aber habs jetzt nicht alles ausgeführt, da ich nicht extra die extract-xml.ps1 geschrieben hab
 
  • Gefällt mir
Reaktionen: nonick65, BeBur und Faluröd
Danke dir vielmals! Ganz läuft es noch nicht, aber 90% des Weges sollten für docx erledigt sein. Die C:\Users\<myUserID>\.gitconfig habe ich erweitert und im selben Ordner die .gitattributes abgelegt. Damit konnte ich schon erreichen, dass Git definitiv was anders macht als den standardmäßigen diff.

Außerhalb von Git habe ich in cmd folgenden Befehl gefunden, der (soweit ich das bisher beurteilen kann) das gewünschte Zusammenfassen der Dateien erledigt:
tar -O -xf myFileName.docx

Jetzt muss ich also nur noch beides verknüpfen. Da bin ich gerade noch am Tüfteln, wie ich den Dateinamen durchreiche. In den Beispielen hier übernimmt "$1" diese Rolle, habe ich allerdings noch nicht zum Laufen gebracht. Zumindest weiß ich schon mal, wonach ich suchen muss :)
 
In Bash sollte "$1" im Dateinamen enthalten sein
In PowerShell: param([string]$filename) nutzen

Teste das Skript dann manuell:

sh
./extract-docx.sh myFile.docx

Falls dakein Fehler kommt, liegt das Problem eher bei Git.
 
  • Gefällt mir
Reaktionen: Faluröd
Jetzt bin ich für docx bei einer lauffähigen Lösung. Ich wiederhole manches, damit alles auf einem Blick steht, falls sich noch jemand dafür interessiert.

Schritt 1:
C:\Users\<myUserID>\.gitattributes öffnen bzw. neu anlegen. Dann folgende Zeile ergänzen:

*.docx diff=zip

Schritt 2:
C:\Users\<myUserID>\.gitconfig öffnen / neu anlgen. Folgende Zeilen ergänzen:

[diff "zip"]
textconv = powershell -ExecutionPolicy Bypass -File C:/Users/<myUserID>/ProcessZippedXML.ps1

Schritt 3:
Das im Schritt 2 definierte PowerShell-Skript erstellen. Das Skript führt folgenden Befehl aus:

C:/Users/<myUserID>/unzip.exe -c -a

Schritt 4:
Das unzip-Tool herunterladen (gibt es hier auch als Windows-Version). Da hat es bei mir gereicht, lediglich die vom Archiv die \bin\unzip.exe dort abzulegen, wo das PowerShell-Skript danach sucht. Das Unzip funktioniert im Unterschied zum tar auch ohne Pfad. Hab's zwar nicht ganz verstanden, aber Hauptsache es läuft ;).


Anwendungsbeispiel:
Folgendes Word neu erstellt:
1742320795911.png


Wird dann so in Sourcetree angezeigt:
1742320882913.png


Ändert man das Dokument zu:
1742320939716.png


Wird das folgendermaßen angezeigt:
1742320960610.png


Textänderungen werden also erkannt, die Formattierung fällt wohl hinten runter. Nicht perfekt, aber schon mal besser als die Anzeige "sind zwei unterschiedliche binäre Dateien". Wichtig ist dann natürlich, dass man die Grenzen des Vergleichs kennt.

Aber gut, Word-Dokumente waren eher ein Seitenaspekt, um erstmal die Funktionalität zu entwickeln. Spannend wird es, wenn ich ein paar Simulink-Modelle erstelle und darauf dann die Skripten anwende. Da melde ich mich nochmal.

@wertzuiop123 : Danke dir für deine Unterstützung bei diesem Nicht-Allerwelts-Thema!
 
  • Gefällt mir
Reaktionen: Marco01_809 und wertzuiop123
Zurück
Oben