Diff de Config : Comparer fichiers INI, TOML, .env en ligne
Collez deux fichiers de configuration côte à côte et voyez exactement quelles clés, valeurs et commentaires ont changé. Fonctionne pour .env, TOML, INI, .properties et .conf.
Qu'est-ce que l'outil de diff de configuration ?
Un outil gratuit dans le navigateur pour diffeur des fichiers de configuration. Collez un .env de staging à gauche, celui de production à droite, et les clés manquantes, valeurs modifiées et commentaires obsolètes s'allument immédiatement. Même flux pour un pyproject.toml avant et après une mise à jour Poetry, un nginx.conf que vous êtes sur le point de recharger, ou un application.properties Java qui passe entre environnements.
Le diff est au niveau du caractère. Il n'y a pas de parser, pas de schéma, pas d'opinion sur le dialecte que vous collez. C'est volontaire. Les fichiers de configuration ne partagent pas une grammaire unique. INI n'a pas de spec formelle et chaque parser est en désaccord sur les guillemets et les échappements. TOML 1.0 a une grammaire stricte mais ajoute des valeurs typées. Les fichiers .env n'ont aucune spec du tout, juste ce que dotenv ou votre shell décide de faire.
Si vous êtes venu chercher de la prose simple, notre outil de diff de texte est le bon choix. Pour la configuration YAML (manifests Kubernetes, valeurs Helm, playbooks Ansible), utilisez diff de YAML. Pour de la config qui circule en JSON (réglages VS Code, package.json npm, tfstate Terraform), diff de JSON gère le réordonnement d'objets plus proprement qu'un diff de texte.
Comment fonctionne le diff en pratique
Le diff tourne au niveau du caractère, puis une passe de post-traitement sémantique déplace les surlignages pour qu'ils tombent sur des clés entières, des valeurs entières et des lignes de commentaires complètes plutôt que sur du bruit au milieu d'un token. Les insertions s'affichent en vert dans le panneau de droite, les suppressions en rouge à gauche. Le compteur de changements dans chaque en-tête vous indique combien de modifications distinctes l'algorithme a trouvées.
Les formats de configuration varient assez pour qu'aucun parser unique ne puisse tous les servir, donc cet outil reste délibérément agnostique au format. .env est le plus laxiste : la plupart des loaders traitent tout le côté droit comme une chaîne, mais certains expansent $VAR et d'autres non, certains honorent export, et la mise entre guillemets autour des valeurs avec espaces dépend du parser. Les fichiers .properties (le standard Java, documenté dans l'API java.util.Properties) acceptent = ou : comme séparateur et exigent des échappements Unicode comme \u00e9 pour les caractères non-ASCII. Les fichiers INI dans la nature vont de la convention Windows (sections entre crochets, points-virgules pour commentaires) au dialecte légèrement différent qu'accepte le module configparser de Python.
Trois pièges réels à connaître avant de faire confiance à un diff propre. Premièrement, les espaces en fin de ligne. Une valeur comme API_KEY=abc avec un espace parasite à la fin de la ligne est une chaîne différente pour la plupart des loaders, et le diff la signalera mais les humains voient rarement l'espace fautif. Deuxièmement, les fins de ligne. Un fichier commité sous Windows avec CRLF et un autre écrit sous Linux avec LF auront le même contenu mais le diff montrera chaque ligne comme modifiée ; formatez les deux côtés ou normalisez les fins avant. Troisièmement, le byte order mark UTF-8. Notepad sous Windows écrit toujours allègrement un BOM au début d'un .env sauvegardé, ce qui fait trébucher la plupart des loaders et se présente comme un diff fantôme d'un caractère à la ligne 1.
Comment comparer des fichiers de config en trois étapes
Deux panneaux de texte, un diff. Rien n'est uploadé. Rien n'est journalisé.
- 1
Collez ou uploadez votre config
Collez l'ancienne config à gauche, la nouvelle à droite. Ou cliquez Upload sur l'un des côtés pour charger directement un fichier .env, .toml, .ini, .properties ou .conf. Le bouton Sample remplit les deux panneaux avec un petit exemple .env pour que vous voyiez comment se rendent les changements de valeur, les nouvelles clés et les entrées supprimées avant de coller la vôtre.
- 2
Formatez et normalisez
Cliquez Format sur chaque panneau pour rogner les espaces de fin et appliquer des fins de ligne cohérentes. Cela tue la classe la plus commune de faux positifs : deux fichiers qui paraissent identiques mais diffent comme totalement différents parce que l'un a été sauvegardé en CRLF et l'autre en LF. Le diff se concentre sur les vrais changements de clés et valeurs une fois que les deux côtés sont d'accord sur les espaces.
- 3
Lisez le diff
Les suppressions apparaissent avec un surlignage rouge à gauche, les insertions avec un surlignage vert à droite. Faites défiler un côté et l'autre suit. Les commentaires et les clés commentées sont diffés comme du texte ordinaire, donc une clé que vous avez retirée en préfixant avec # apparaît comme la ligne de commentaire ajoutée plutôt que comme la clé supprimée.
Quand le diff de config est le bon outil
Diffeur des fichiers .env entre local et staging
Vous lancez une branche de feature en local, ça marche, puis ça crashe sur staging parce que STRIPE_WEBHOOK_SECRET manque dans le .env de staging. Collez le fichier local qui marche contre celui de staging et la clé manquante, l'hôte DATABASE_URL modifié et le LOG_LEVEL=debug obsolète remontent tous d'un coup. Plus rapide que parcourir les deux fichiers ligne par ligne, et bien plus sûr que de lancer un script qui imprime les deux ensembles de variables sur un terminal.
Comparer pyproject.toml après une mise à jour de dépendances
Poetry ou uv vient de réécrire votre pyproject.toml après un poetry update. Diffez la version commitée précédente contre l'arbre de travail pour confirmer les vraies montées de version : fastapi est passé de 0.110.0 à 0.115.4, une nouvelle table [tool.ruff.lint] est apparue, et le pin build-system.requires a bougé. La spec TOML 1.0 est assez stricte pour que le diff soit normalement propre et facile à lire.
Examiner les changements de nginx.conf avant de recharger
Recharger nginx avec une config cassée fait tomber un site de production plus vite que presque n'importe quoi d'autre. Avant le nginx -s reload, collez le nginx.conf en cours d'exécution contre celui proposé et confirmez que le changement est exactement ce que vous vouliez : un nouveau bloc upstream, une cible proxy_pass mise à jour, un swap de cipher suite TLS. Le diff attrape le point-virgule manquant accidentel à chaque fois.
Auditer une unit systemd ou une config supervisord
Un service redémarre en boucle après un déploiement. Diffez le foo.service qui marchait contre le nouveau et vous trouvez d'habitude la cause en moins de trente secondes : un ExecStart modifié, une ligne Environment= retirée, un NoNewPrivileges resserré. Même flux pour les blocs .conf de supervisord, les run-scripts runit et les divers configs init en .ini qu'on voit encore sur les vieilles machines.
Comparer des fichiers de config infrastructure-as-code
Variables Terraform dans terraform.tfvars, configs de stack Pulumi, group_vars Ansible, valeurs Helm pour ConfigMaps Kubernetes. Chaque environnement a sa copie et la seule façon sûre de les fusionner est de diffeur. Collez prod contre staging et la dérive saute aux yeux : une région épinglée à us-east-1 dans l'une et us-west-2 dans l'autre, un type d'instance que quelqu'un a augmenté pendant un incident et jamais reverté, un ARN d'IAM role qui pointe sur le mauvais compte.
Vérifier qu'un fichier d'environnement de CI correspond au template documenté
Une nouvelle ingénieure arrive, copie le .env.example du dépôt, et la build échoue toujours sur sa première PR parce que le template a dérivé de ce que le pipeline CI attend réellement. Diffez le .env.example commité contre un .env known-good de quelqu'un dont les builds passent et les clés manquantes apparaissent en rouge à gauche ou en vert à droite. Même astuce pour les blocs env Taskfile, les sections env: de GitHub Actions et les fichiers .envrc de direnv.
Référence rapide des formats de config
Une fiche aide-mémoire courte sur les formats que cet outil voit le plus souvent. La configuration est plus désordonnée que sa réputation ne le suggère, et les différences ci-dessous sont là où la plupart des diffs déraillent.
| Topic | What this tool does |
|---|
| Dialectes de format | INI (pas de spec formelle, dialectes par parser), TOML 1.0 (strict, typé), .env (pas de spec, défini par parser), .properties (Java, voir java.util.Properties), .conf (par application : nginx, Apache, sshd_config diffèrent tous). |
|---|
| Caractères de commentaire | INI : ; ou #. TOML : # uniquement. .env : # uniquement, et seulement en début de ligne dans la plupart des loaders. .properties : # ou !. nginx .conf : # uniquement. |
|---|
| En-têtes de section | INI et TOML utilisent [section]. TOML ajoute des tables imbriquées via [a.b.c] et des tableaux de tables via [[a]]. .env et .properties sont plats, sans sections. nginx utilise des blocs { ... } au lieu d'en-têtes. |
|---|
| Types de valeur | TOML a des valeurs typées : chaînes, ints, floats, bools, dates, tableaux, tables. INI, .env et .properties sont uniquement chaînes ; l'application décide comment parser true ou 42. |
|---|
| Interpolation et expansion | La plupart des loaders dotenv n'expansent pas $VAR par défaut. Certains le font (dotenv-expand, direnv, sourcing shell via source .env). TOML n'expanse jamais. INI expanse rarement ; configparser de Python supporte ${section:key} si vous l'activez. |
|---|
| Espaces de fin de ligne | Une vraie source de bugs. FOO=bar avec un espace de fin met FOO à "bar " dans la plupart des loaders, ce qui échoue aux contrôles d'égalité de chaîne en aval. Toujours rogner ou mettre entre guillemets. |
|---|
| Fins de ligne | CRLF (Windows) vs LF (Unix). Deux fichiers identiques sauvegardés sur des OS différents diffent comme toutes-lignes-modifiées. Utilisez le bouton Format ou normalisez les fins (dos2unix, git config core.autocrlf) avant de diffeur. |
|---|
| Encodage et BOM | TOML impose UTF-8. .properties exigeait historiquement ISO-8859-1 avec des échappements \uXXXX, mais le Java moderne accepte UTF-8 via Properties.load(Reader). Un BOM UTF-8 au début d'un .env est une cause classique de diff fantôme ; Notepad sous Windows en écrit toujours un par défaut. |
|---|
Diff de config : questions fréquentes
L'outil comprend-il les types de valeur ?
Non. C'est un diff de texte. TOML distingue chaînes, entiers, flottants, booléens, dates et tableaux, mais le diff traite chaque ligne comme du texte simple et vous montre quels caractères ont changé. C'est habituellement suffisant parce que les changements de configuration sont des changements de caractères de toute façon. Si vous avez vraiment besoin d'une comparaison typée, parsez les deux fichiers dans le langage de votre choix (tomllib de Python, crate toml de Rust, pelletier/go-toml de Go) et comparez les maps résultantes. Pour le cas à 95%, le diff de texte attrape ce qu'il faut attraper.
Comment gérer des lignes commentées qui « diffèrent » mais sont équivalentes ?
Habituellement vous ne les gérez pas, et vous devriez être content que l'outil l'ait signalé. Une ligne qui passe de API_KEY=abc à #API_KEY=abc est sémantiquement significative : la clé est maintenant désactivée. Le diff souligne le changement de préfixe de commentaire, qui est exactement ce qu'un revieweur humain devrait voir pendant une revue de config. Si vous voulez vraiment ignorer le bruit des commentaires, formatez les deux côtés pour retirer les lignes de commentaire seul avant de coller, mais c'est rarement la bonne approche pour un fichier sensible côté sécurité.
Comment vérifier si une clé manque d'un côté ?
Collez les deux fichiers, lancez le diff, et toute clé présente d'un côté et absente de l'autre apparaît comme une suppression rouge ou une insertion verte de la ligne entière. Le diff n'essaie pas d'aligner les clés structurellement, donc une clé réordonnée à une autre position apparaîtra une fois en suppression et une fois en insertion. Pour une comparaison totalement insensible à l'ordre, triez les deux fichiers par clé d'abord (sort .env sur Unix) puis diffez. L'approche agnostique au format attrape les clés manquantes sans avoir besoin d'un parser.
Est-il sûr de coller des fichiers .env avec de vrais secrets ?
Oui, votre input ne quitte jamais le navigateur. Le diff tourne entièrement côté client. Pas d'upload serveur, pas de télémétrie sur le contenu des panneaux, pas d'analytics qui captureraient ce que vous avez tapé. C'est intentionnel parce que les diffs de .env sont l'un des flux de plus haute confiance sur ce site. Si vous êtes paranoïaque (et vous devriez l'être un peu), ouvrez les devtools du navigateur et confirmez que l'onglet Réseau reste vide pendant que vous collez. Pour les organisations qui préfèrent un outil entièrement air-gapped, ouvrez le site hors ligne une fois et les assets en cache fonctionnent sans accès réseau supplémentaire.
Quelle est la différence entre TOML et INI ?
INI est une convention ; TOML est une spécification. INI a grandi sur Windows, n'a pas de grammaire formelle, et chaque parser gère les cas limites (guillemets, échappements, valeurs de liste, sections imbriquées) un peu différemment. TOML 1.0 est une spec stricte et versionnée utilisée par Cargo, Poetry, Hugo et de plus en plus par le packaging Python via pyproject.toml. Les deux utilisent des en-têtes [section] et des paires key = value, donc ils se ressemblent au premier coup d'œil, mais TOML ajoute des valeurs typées, des littéraux datetime et des tables inline que les fichiers INI classiques n'ont pas.
Le diff normalise-t-il la casse des clés ou les espaces ?
Non. API_KEY=abc et api_key=abc sont des lignes différentes pour le diff parce que ce sont des octets différents. La plupart des loaders sont aussi sensibles à la casse (dotenv, java.util.Properties, configparser par défaut), donc cela colle à la réalité. Les espaces autour du = sont préservés tels quels, ce qui compte parce que quelques parsers plus stricts (notamment certains patterns de sourcing Bash) rejettent FOO = bar avec espaces et n'acceptent que FOO=bar. Le bouton Format rogne les espaces de fin sur chaque ligne, ce qui est la seule étape de normalisation qu'il applique.
Confidentialité et fonctionnement
Vos fichiers de configuration ne quittent jamais le navigateur. Le diff, le formateur et chaque octet de votre input restent sur votre machine, en local. Pas d'analytics sur le contenu des panneaux, pas de logs, pas d'upload. Cela compte plus ici que sur la plupart des outils de diff parce que les fichiers .env contiennent régulièrement des mots de passe de base de données, des API keys et des secrets clients OAuth, et les coller dans un outil qui les fait transiter par un serveur serait un vrai incident de sécurité. Lectures de fond sur les formats : TOML 1.0, fichiers INI et le concept Unix de variables d'environnement. Pour les secrets qui ne doivent pas vivre dans un fichier du tout, regardez sops, HashiCorp Vault ou AWS Parameter Store.