Git für Binärdateien

git diff lässt sich konfigurieren, sodass es auch bei Binärdateien sinnvolle Diffs anzeigen kann.

… für Excel-Dateien

Hierfür benötigen wir openpyxl und pandas:

$ pipenv install openpyxl pandas

Anschließend können wir in exceltocsv.py pandas.DataFrame.to_csv zum Konvertieren der Excel-Dateien verwenden:

exceltocsv.py
import sys

from io import StringIO

import pandas as pd


for sheet_name in pd.ExcelFile(sys.argv[1]).sheet_names:
    output = StringIO()
    print("Sheet: %s" % sheet_name)
    pd.read_excel(sys.argv[1], sheet_name=sheet_name).to_csv(
        output, header=True, index=False
    )
    print(output.getvalue())

Nun fügt ihr noch in der globalen Git-Konfiguration in der Datei ~/.gitconfig den folgenden Abschnitt hinzu:

[diff "excel"]
    textconv=python3 /PATH/TO/exceltocsv.py
    binary=true

Schließlich wird in der globalen ~/.gitattributes-Datei unser excel-Konverter mit *.xlsx-Dateien verknüpft:

*.xlsx diff=excel

… für PDF-Dateien

Hierfür wird zusätzlich pdftohtml benötigt. Ihr installiert es mit

$ sudo apt install poppler-utils
$ brew install pdftohtml

Anschließend fügt ihr den folgenden Abschnitt der globalen Git-Konfiguration in der Datei ~/.gitconfig hinzu:

[diff "pdf"]
    textconv=pdftohtml -stdout

Schließlich wird in der globalen ~/.gitattributes-Datei unser pdf-Konverter mit *.pdf-Dateien verknüpft:

*.pdf diff=pdf

Nun wird beim Aufruf von git diff die PDF-Datei zunächst konvertiert und dann ein Diff über den Ausgaben des Konverters durchgeführt.

… für Word-Dokumente

Auch Unterschiede in Word-Dokumenten lassen sich anzeigen. Hierfür kann Pandoc verwendet werden, das einfach installiert werden kann mit

$ sudo apt install pandoc
$ brew install pandoc

Herunterladen und Installieren der aktuellen .msi-Datei von GitHub.

Anschließend wird der globalen Git-Konfiguration ~/.gitconfig folgender Abschnitt hinzugefügt:

[diff "word"]
        textconv=pandoc --to=markdown
        binary=true
        prompt=false

Schließlich wird in der globalen ~/.gitattributes-Datei unser word-Konverter mit *.docx-Dateien verknüpft:

*.docx diff=word

Die gleiche Vorgehensweise kann auch angewandt werden, um nützliche Diffs von anderen Binärdateien zu erhalten, z.B. *.zip, *.jar und andere Archive mit unzip oder für Änderungen in den Metainformationen von Bildern mit exiv2. Zudem gibt es Konvertierungswerkzeuge für die Umwandlung von *.odt, *.doc und anderen Dokumentenformaten in einfachen Text. Für Binärdateien, für die es keinen Konverter gibt, reichen oft auch Strings aus.