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:

$ uv add 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(f"Sheet: {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 ~/.config/git/config den folgenden Abschnitt hinzu:

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

Schließlich wird in der globalen ~/.config/git/attributes-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 ~/.config/git/config hinzu:

[diff "pdf"]
    textconv=pdftohtml -stdout

Schließlich wird in der globalen ~/.config/git/attributes-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 Dokumente

Auch Unterschiede in 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 ~/.config/git/config folgender Abschnitt hinzugefügt:

[diff "pandoc-to-markdown"]
    textconv = pandoc --to markdown
    cachetextconv = true

Schließlich wird in der globalen ~/.config/git/attributes-Datei unser pandoc-to-markdown-Konverter mit *.docx, *.odt und *.rtf-Dateien verknüpft:

*.docx diff=pandoc-to-markdown
*.odt diff=pandoc-to-markdown
*.rtf diff=pandoc-to-markdown

Tipp

Jupyter Notebooks schreiben in eine JSON-Datei *.ipynb, die ziemlich dicht und insbesondere bei Diffs schwer zu lesen ist. Die Markdown-Darstellung von Pandoc vereinfact dies:

*.ipynb diff=pandoc-to-markdown

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.

… für Medien-Dateien

ExifTool kann verwendet werden um die Metadaten der Medien-Dateien in Text zu konvertieren.

$ sudo apt install libimage-exiftool-perl
$ brew install exiftool
> choco install exiftool

Siehe auch

Anschließend könnt ihr in der globalen Git-Konfigurationsdatei ~/.config/git/config folgenden Abschnitt hinzufügen:

[diff "exiftool"]
textconv = exiftool --composite -x 'Exiftool:*'
cachetextconv = true
xfuncname =
"^-.*$"

Schließlich wird in der ~/.config/git/attributes der exiftool-Konverter mit Datei-Endungen von Medien-Dateien verknüpft:

*.avif diff=exiftool
*.bmp diff=exiftool
*.gif diff=exiftool
*.jpeg diff=exiftool
*.jpg diff=exiftool
*.png diff=exiftool
*.webp diff=exiftool

Siehe auch

exiftool kann noch viele weitere Medien-Dateien verarbeiten. Eine vollständige Liste erhaltet ihr in Supported File Types.