Originale Konfiguration
Geänderte Konfiguration

Config-Diff: INI, TOML, .env Dateien online vergleichen

Fügen Sie zwei Konfigurationsdateien nebeneinander ein und sehen Sie genau, welche Schlüssel, Werte und Kommentare sich geändert haben. Funktioniert mit .env, TOML, INI, .properties und .conf.

Was ist das Config-Diff-Tool?

Ein kostenloses Browser-Tool zum Diffen von Konfigurationsdateien. Fügen Sie eine Staging-.env links ein, die Produktions-Datei rechts, und fehlende Schlüssel, geänderte Werte und veraltete Kommentare leuchten sofort auf. Gleicher Ablauf für eine pyproject.toml vor und nach einem Poetry-Update, eine nginx.conf kurz vor dem Reload, oder eine Java-application.properties, die zwischen Umgebungen wandert.

Der Diff arbeitet auf Zeichenebene. Kein Parser, kein Schema, keine Meinung darüber, welchen Dialekt Sie einfügen. Das ist Absicht. Konfigurationsdateien teilen sich keine gemeinsame Grammatik. INI hat keine formale Spec und jeder Parser ist sich uneins über Quoting und Escapes. TOML 1.0 hat eine strikte Grammatik, fügt aber typisierte Werte hinzu. .env-Dateien haben überhaupt keine Spec, nur das, was dotenv oder Ihre Shell zufällig tun.

Wenn Sie auf der Suche nach einfachem Fließtext sind, ist unser Text-Diff-Tool die richtige Wahl. Für YAML-Konfiguration (Kubernetes-Manifeste, Helm-Values, Ansible-Playbooks) nutzen Sie YAML-Diff. Für Config, die als JSON ausgeliefert wird (VS-Code-Settings, npm-package.json, Terraform-tfstate), behandelt JSON-Diff Object-Reordering sauberer als ein Text-Diff es kann.

Wie der Diff tatsächlich arbeitet

Der Diff läuft auf Zeichenebene, dann verschiebt ein semantischer Nachbearbeitungsschritt die Highlights so, dass sie auf ganze Schlüssel, ganze Werte und ganze Kommentarzeilen treffen, statt auf Rauschen mitten im Token. Einfügungen erscheinen grün im rechten Panel, Löschungen rot links. Der Änderungszähler in jedem Header sagt Ihnen, wie viele eigenständige Änderungen der Algorithmus gefunden hat.

Konfigurationsformate variieren genug, sodass ein einzelner Parser nicht für alle taugt, also bleibt dieses Tool absichtlich format-agnostisch. .env ist das lockerste: Die meisten Loader behandeln die gesamte rechte Seite als String, manche expandieren $VAR und manche nicht, manche respektieren export, und das Quoting um Werte mit Leerzeichen ist parser-spezifisch. .properties-Dateien (der Java-Standard, dokumentiert in der java.util.Properties API) akzeptieren entweder = oder : als Trenner und verlangen Unicode-Escapes wie \u00e9 für Nicht-ASCII-Zeichen. INI-Dateien in freier Wildbahn reichen von der Windows-Konvention (Sektionen in eckigen Klammern, Semikolons für Kommentare) bis zum leicht abweichenden Dialekt, den das configparser-Modul von Python akzeptiert.

Drei Praxis-Stolperfallen, die man kennen sollte, bevor man einem sauberen Diff vertraut. Erstens, Whitespace am Zeilenende. Ein Wert wie API_KEY=abc mit einem versehentlichen Leerzeichen am Zeilenende ist für die meisten Loader ein anderer String, und der Diff zeigt das an, aber Menschen sehen das schuldige Leerzeichen selten. Zweitens, Zeilenenden. Eine unter Windows mit CRLF eingecheckte Datei und eine unter Linux mit LF geschriebene haben den gleichen Inhalt, aber der Diff zeigt jede Zeile als geändert; formatieren Sie beide Seiten oder normalisieren Sie die Endings vorher. Drittens, das UTF-8 Byte Order Mark. Notepad unter Windows schreibt fröhlich weiter ein BOM an den Anfang einer gespeicherten .env, woran die meisten Loader scheitern und was sich als Phantom-Diff von einem Zeichen in Zeile 1 zeigt.

Config-Dateien in drei Schritten vergleichen

Zwei Textfenster, ein Diff. Nichts wird hochgeladen. Nichts wird geloggt.

  1. 1

    Config einfügen oder hochladen

    Fügen Sie die alte Config links ein, die neue rechts. Oder klicken Sie Upload auf einer der Seiten, um eine .env-, .toml-, .ini-, .properties- oder .conf-Datei direkt zu laden. Der Sample-Button füllt beide Panels mit einem kleinen .env-Beispiel, damit Sie sehen, wie Wertänderungen, neue Schlüssel und entfernte Einträge gerendert werden, bevor Sie Ihre eigenen einfügen.

  2. 2

    Formatieren und normalisieren

    Klicken Sie Format auf jedem Panel, um trailing Whitespace zu trimmen und konsistente Zeilenenden anzuwenden. Das tötet die häufigste Klasse von False-Positives: zwei Dateien, die identisch aussehen, aber als komplett unterschiedlich diffen, weil eine mit CRLF und die andere mit LF gespeichert wurde. Der Diff fokussiert sich auf echte Schlüssel- und Wertänderungen, sobald sich beide Seiten beim Whitespace einig sind.

  3. 3

    Den Diff lesen

    Löschungen erscheinen mit rotem Highlight links, Einfügungen mit grünem Highlight rechts. Wenn Sie eine Seite scrollen, folgt die andere. Kommentare und auskommentierte Schlüssel werden als gewöhnlicher Text gediffed, also erscheint ein Schlüssel, den Sie durch Voranstellen von # entfernt haben, als die hinzugefügte Kommentarzeile statt als der gelöschte Schlüssel.

Wann Config-Diff das richtige Tool ist

.env-Dateien zwischen lokal und Staging diffen

Sie starten einen Feature-Branch lokal, läuft sauber, dann crasht es auf Staging, weil STRIPE_WEBHOOK_SECRET in der Staging-.env fehlt. Fügen Sie die funktionierende lokale Datei gegen die Staging-Datei ein und der fehlende Schlüssel, der geänderte DATABASE_URL-Host und das veraltete LOG_LEVEL=debug tauchen alle in einem Durchgang auf. Schneller als beide Dateien Zeile für Zeile durchzugehen, und viel sicherer als ein Skript laufen zu lassen, das beide Variablensets in ein Terminal druckt.

pyproject.toml nach einem Dependency-Upgrade vergleichen

Poetry oder uv hat gerade Ihre pyproject.toml nach einem poetry update umgeschrieben. Diffen Sie die zuvor commitete Version gegen den Working Tree, um die tatsächlichen Upgrades zu bestätigen: fastapi ging von 0.110.0 auf 0.115.4, eine neue [tool.ruff.lint]-Tabelle erschien, und der build-system.requires-Pin verschob sich. Die TOML 1.0 Spec ist strikt genug, dass der Diff normalerweise sauber und gut lesbar ist.

nginx.conf-Änderungen vor dem Reload prüfen

nginx mit kaputter Config zu reloaden, legt eine Produktionsseite schneller lahm als fast alles andere auf einem Server. Vor dem nginx -s reload: Fügen Sie die laufende nginx.conf gegen die vorgeschlagene ein und bestätigen Sie, dass die Änderung genau die ist, die Sie wollten: ein neuer upstream-Block, ein aktualisiertes proxy_pass-Ziel, ein TLS-Cipher-Suite-Tausch. Der Diff fängt das versehentlich fehlende Semikolon jedes Mal.

Eine systemd-Unit oder supervisord-Config auditieren

Ein Service startet nach einem Deploy in einer Schleife neu. Diffen Sie die funktionierende foo.service gegen die neue und Sie finden die Ursache meist innerhalb von dreißig Sekunden: ein geändertes ExecStart, eine entfallene Environment=-Zeile, ein verschärftes NoNewPrivileges. Gleicher Ablauf für supervisord-.conf-Blöcke, runit-Run-Skripte und die diversen .ini-artigen Init-Configs, die man auf älteren Maschinen noch sieht.

Infrastructure-as-Code-Configs vergleichen

Terraform-Variablen in terraform.tfvars, Pulumi-Stack-Configs, Ansible-group_vars, Helm-Values für Kubernetes-ConfigMaps. Jede Umgebung hat ihre eigene Kopie und der einzig sichere Weg sie zu mergen ist diffen. Fügen Sie Prod gegen Staging ein und die Drift springt heraus: eine Region in einem auf us-east-1 gepinned und in der anderen auf us-west-2, ein Instance-Type, den jemand während eines Incidents hochgesetzt und nie zurückgesetzt hat, ein IAM-Role-ARN, der auf den falschen Account zeigt.

Prüfen, ob eine CI-Environment-Datei zum dokumentierten Template passt

Ein neuer Engineer startet, kopiert die .env.example aus dem Repo, und der Build scheitert trotzdem an seiner ersten PR, weil das Template von dem abgedriftet ist, was die CI-Pipeline tatsächlich erwartet. Diffen Sie die commitete .env.example gegen eine bekannt-gute .env von jemandem, dessen Builds durchgehen, und die fehlenden Schlüssel zeigen sich als Rot links oder Grün rechts. Gleicher Trick funktioniert für Taskfile-env-Blöcke, GitHub Actions env:-Sektionen und direnv-.envrc-Dateien.

Schnellreferenz Config-Formate

Eine kurze Übersichtskarte zu den Formaten, die dieses Tool am häufigsten sieht. Konfiguration ist chaotischer, als ihr Ruf vermuten lässt, und die untenstehenden Unterschiede sind dort, wo die meisten Diffs aus dem Ruder laufen.

TopicWhat this tool does
Format-DialekteINI (keine formale Spec, Dialekte je Parser), TOML 1.0 (strikt, typisiert), .env (keine Spec, parser-definiert), .properties (Java, siehe java.util.Properties), .conf (je Anwendung: nginx, Apache, sshd_config unterscheiden sich alle).
Kommentar-ZeichenINI: ; oder #. TOML: nur #. .env: nur #, und in den meisten Loadern nur am Zeilenanfang. .properties: # oder !. nginx .conf: nur #.
Sektion-HeaderINI und TOML nutzen [section]. TOML fügt verschachtelte Tabellen via [a.b.c] und Arrays von Tabellen via [[a]] hinzu. .env und .properties sind flach, ohne Sektionen. nginx nutzt { ... }-Blöcke statt Header.
WerttypenTOML hat typisierte Werte: Strings, Ints, Floats, Bools, Daten, Arrays, Tabellen. INI, .env und .properties sind nur String; die Anwendung entscheidet, wie true oder 42 geparst wird.
Interpolation und ExpansionDie meisten dotenv-Loader expandieren $VAR standardmäßig nicht. Manche tun es (dotenv-expand, direnv, Shell-Sourcing via source .env). TOML expandiert nie. INI expandiert selten; Pythons configparser unterstützt ${section:key}, wenn man es einschaltet.
Trailing WhitespaceEine echte Bug-Quelle. FOO=bar mit Leerzeichen am Ende setzt FOO in den meisten Loadern auf "bar ", was downstream String-Gleichheitschecks bricht. Immer trimmen oder quoten.
ZeilenendenCRLF (Windows) vs LF (Unix). Zwei identische Dateien auf verschiedenen OS gespeichert diffen als jede-Zeile-geändert. Format-Button nutzen oder Endings normalisieren (dos2unix, git config core.autocrlf) vor dem Diffen.
Encoding und BOMTOML schreibt UTF-8 vor. .properties verlangte historisch ISO-8859-1 mit \uXXXX-Escapes, aber modernes Java akzeptiert UTF-8 via Properties.load(Reader). Ein UTF-8-BOM am Anfang einer .env ist ein klassischer Phantom-Diff-Verursacher; Notepad unter Windows schreibt es weiterhin standardmäßig.

Config-Diff: häufig gestellte Fragen

Versteht das Tool Werttypen?

Nein. Es ist ein Text-Diff. TOML unterscheidet Strings, Integers, Floats, Booleans, Daten und Arrays, aber der Diff behandelt jede Zeile als Klartext und zeigt, welche Zeichen sich geändert haben. Das ist meist okay, weil Konfigurationsänderungen sowieso Zeichenänderungen sind. Wenn Sie wirklich einen typisierten Vergleich brauchen, parsen Sie beide Dateien in der Sprache Ihrer Wahl (Pythons tomllib, Rusts toml-Crate, Gos pelletier/go-toml) und vergleichen die resultierenden Maps. Für den 95%-Fall fängt der Text-Diff, was Sie fangen müssen.

Wie gehe ich mit auskommentierten Zeilen um, die "abweichen" aber äquivalent sind?

Üblicherweise gar nicht, und Sie sollten froh sein, dass das Tool es markiert hat. Eine Zeile, die von API_KEY=abc zu #API_KEY=abc wechselt, ist semantisch bedeutsam: Der Schlüssel ist jetzt deaktiviert. Der Diff hebt den Kommentar-Prefix-Wechsel hervor, was genau das ist, was ein menschlicher Reviewer bei einem Config-Review sehen sollte. Wenn Sie wirklich Kommentar-Churn ignorieren wollen, formatieren Sie beide Seiten so, dass reine Kommentarzeilen vor dem Einfügen wegfallen, aber das ist selten der richtige Schritt für eine sicherheitsrelevante Datei.

Wie prüfe ich, ob auf einer Seite ein Schlüssel fehlt?

Beide Dateien einfügen, Diff laufen lassen, und jeder Schlüssel, der auf einer Seite vorhanden und auf der anderen abwesend ist, erscheint als rote Löschung oder grüne Einfügung der gesamten Zeile. Der Diff versucht nicht, Schlüssel strukturell auszurichten, also erscheint ein an eine andere Position umsortierter Schlüssel einmal als Löschung und einmal als Einfügung. Für einen vollständig reihenfolgen-unabhängigen Vergleich sortieren Sie zuerst beide Dateien nach Schlüssel (sort .env auf Unix) und diffen dann. Der format-agnostische Ansatz fängt fehlende Schlüssel ohne Parser.

Ist es sicher, .env-Dateien mit echten Secrets einzufügen?

Ja, Ihr Input verlässt nie den Browser. Der Diff läuft komplett auf dem Client. Kein Server-Upload, keine Telemetrie zu den Inhalten der Panels, keine Analytics, die erfassen, was Sie getippt haben. Das ist Absicht, weil .env-Diffs zu den Vertrauenshöchstpunkten dieser Site gehören. Wenn Sie paranoid sind (und Sie sollten ein bisschen paranoid sein), öffnen Sie die Browser-DevTools und bestätigen Sie, dass der Network-Tab leer bleibt, während Sie einfügen. Für Organisationen, die ein vollständig air-gapped Tool bevorzugen: Site einmal offline öffnen und die gecachten Assets funktionieren ohne weiteren Netzzugriff.

Was ist der Unterschied zwischen TOML und INI?

INI ist eine Konvention; TOML ist eine Spezifikation. INI ist auf Windows aufgewachsen, hat keine formale Grammatik, und jeder Parser behandelt Edge Cases (Quoting, Escapes, Listenwerte, verschachtelte Sektionen) etwas anders. TOML 1.0 ist eine strikte, versionierte Spec, die von Cargo, Poetry, Hugo und zunehmend vom Python-Packaging via pyproject.toml genutzt wird. Beide nutzen [section]-Header und key = value-Paare, sehen also auf den ersten Blick ähnlich aus, aber TOML fügt typisierte Werte, Datetime-Literale und Inline-Tabellen hinzu, die klassische INI-Dateien nicht haben.

Normalisiert der Diff die Schlüssel-Schreibweise oder Whitespace?

Nein. API_KEY=abc und api_key=abc sind für den Diff verschiedene Zeilen, weil es verschiedene Bytes sind. Die meisten Loader sind ebenfalls case-sensitiv (dotenv, java.util.Properties, configparser standardmäßig), das passt also zur Realität. Whitespace um das = wird unverändert beibehalten, was zählt, weil ein paar striktere Parser (besonders manche Bash-Sourcing-Patterns) FOO = bar mit Leerzeichen ablehnen und nur FOO=bar akzeptieren. Der Format-Button trimmt trailing Whitespace pro Zeile, was der einzige Normalisierungsschritt ist, den er anwendet.

Datenschutz und wie das funktioniert

Ihre Konfigurationsdateien verlassen den Browser nicht. Der Diff, der Formatter und jedes Byte Ihres Inputs bleiben lokal auf Ihrer Maschine. Keine Analytics zu den Panel-Inhalten, keine Logs, kein Upload. Das zählt hier mehr als bei den meisten Diff-Tools, weil .env-Dateien routinemäßig Datenbank-Passwörter, API-Keys und OAuth-Client-Secrets enthalten, und sie in ein Tool zu kleben, das sie über einen Server schickt, wäre ein echter Sicherheitsvorfall. Hintergrundlektüre zu den Formaten: TOML 1.0, INI-Dateien und das Unix-Konzept der Umgebungsvariablen. Für Secrets, die überhaupt nicht in einer Datei leben sollten, schauen Sie sich sops, HashiCorp Vault oder AWS Parameter Store an.