Config-diff: sammenlign INI-, TOML-, .env-filer online
Lim inn to konfigurasjonsfiler side om side og se nøyaktig hvilke nøkler, verdier og kommentarer som er endret. Fungerer for .env, TOML, INI, .properties og .conf.
Hva er config-diff-verktøyet?
Et gratis nettleserverktøy for å diffe konfigurasjonsfiler. Lim inn en staging-.env til venstre, produksjonsversjonen til høyre, og manglende nøkler, endrede verdier og utdaterte kommentarer lyser opp umiddelbart. Samme flyt for en pyproject.toml før og etter en Poetry-oppdatering, en nginx.conf du er i ferd med å laste på nytt, eller en Java-application.properties som flyttes mellom miljøer.
Diffen er på tegn-nivå. Ingen parser, intet skjema, ingen mening om hvilken dialekt du limer inn. Det er bevisst. Konfigurasjonsfiler deler ikke én samlet grammatikk. INI har ingen formell spec, og hver parser er uenig om quoting og escapes. TOML 1.0 har en stram grammatikk men legger til typede verdier. .env-filer har ingen spec i det hele tatt, bare det dotenv eller skallet ditt tilfeldigvis gjør.
Hvis du kom hit etter vanlig prosa, er tekst-diff-verktøyet vårt riktig valg. For YAML-konfigurasjon (Kubernetes-manifester, Helm-values, Ansible-playbooks) bruk YAML-diff. For config som leveres som JSON (VS Code-innstillinger, npm-package.json, Terraform-tfstate) håndterer JSON-diff objekt-omarrangering renere enn en tekst-diff.
Hvordan diffen faktisk fungerer
Diffen kjører på tegn-nivå, og deretter flytter en semantisk etterbehandlingsrunde fremhevingene slik at de lander på hele nøkler, hele verdier og hele kommentarlinjer i stedet for støy midt i et token. Innsettinger vises i grønt i høyre panel, slettinger i rødt til venstre. Endringstelleren i hver overskrift forteller deg hvor mange distinkte redigeringer algoritmen fant.
Konfigurasjonsformater varierer nok til at én parser ikke kan tjene dem alle, så dette verktøyet forblir bevisst formatagnostisk. .env er det løseste: de fleste loaders behandler hele høyresiden som en streng, men noen utvider $VAR og andre ikke, noen respekterer export, og quoting rundt verdier med mellomrom er parser-spesifikk. .properties-filer (Java-standarden, dokumentert i java.util.Properties API) aksepterer enten = eller : som separator og krever Unicode-escapes som \u00e9 for ikke-ASCII-tegn. INI-filer i naturen strekker seg fra Windows-konvensjonen (seksjoner i hakeparenteser, semikolon for kommentarer) til den litt annerledes dialekten Pythons configparser-modul aksepterer.
Tre virkelige fallgruver verdt å kjenne før du stoler på en ren diff. For det første, blanktegn på slutten av linjen. En verdi som API_KEY=abc med et bortkomment mellomrom på slutten av linjen er en annen streng for de fleste loaders, og diffen flagger det, men mennesker ser sjelden den skyldige plassen. For det andre, linjeskift. En fil committet på Windows med CRLF og en skrevet på Linux med LF har samme innhold men diffen viser hver linje som endret; formater begge sider eller normaliser linjeskiftene først. For det tredje, UTF-8 byte order mark. Notepad på Windows skriver fortsatt blidt en BOM i starten av en lagret .env, noe de fleste loaders snubler i og som viser seg som en spøkelses-diff på ett tegn på linje 1.
Slik sammenligner du config-filer i tre steg
To tekstpaneler, én diff. Ingenting lastes opp. Ingenting logges.
- 1
Lim inn eller last opp configen din
Lim inn den gamle configen til venstre, den nye til høyre. Eller klikk Upload på en av sidene for å laste en .env-, .toml-, .ini-, .properties- eller .conf-fil direkte. Sample-knappen fyller begge paneler med et lite .env-eksempel slik at du ser hvordan verdiendringer, nye nøkler og fjernede oppføringer rendres før du limer inn dine egne.
- 2
Formater og normaliser
Klikk Format på hvert panel for å trimme blanktegn på slutten og bruke konsistente linjeskift. Det dreper den vanligste klassen av falske positive: to filer som ser identiske ut men diffes som helt forskjellige fordi den ene er lagret med CRLF og den andre med LF. Diffen fokuserer på reelle nøkkel- og verdiendringer når begge sider er enige om blanktegn.
- 3
Les diffen
Slettinger vises med rød fremheving til venstre, innsettinger med grønn fremheving til høyre. Scroll en side, og den andre følger med. Kommentarer og utkommenterte nøkler diffes som vanlig tekst, så en nøkkel du fjernet ved å sette # foran, vises som den lagte til kommentarlinjen i stedet for som den slettede nøkkelen.
Når config-diff er riktig verktøy
Diffe .env-filer mellom local og staging
Du starter en feature branch lokalt, det fungerer fint, så krasjer det på staging fordi STRIPE_WEBHOOK_SECRET mangler i stagings .env. Lim inn den fungerende lokale filen mot stagings, og den manglende nøkkelen, den endrede DATABASE_URL-hosten og den utdaterte LOG_LEVEL=debug dukker alle opp i én runde. Raskere enn å gå gjennom begge filene linje for linje, og mye tryggere enn å kjøre et skript som skriver begge variabelsettene til en terminal.
Sammenligne pyproject.toml etter en dependency-oppgradering
Poetry eller uv har nettopp skrevet om pyproject.toml-en din etter en poetry update. Diff den tidligere committede versjonen mot working tree for å bekrefte de faktiske oppgraderingene: fastapi gikk fra 0.110.0 til 0.115.4, en ny [tool.ruff.lint]-tabell dukket opp, og build-system.requires-pinnen flyttet seg. TOML 1.0-spec'en er stram nok til at diffen normalt er ren og lett å lese.
Gjennomgå nginx.conf-endringer før reload
Å reloade nginx med en ødelagt config tar et produksjonssite ned raskere enn nesten alt annet på en server. Før nginx -s reload: lim inn den kjørende nginx.conf mot den foreslåtte og bekreft at endringen er nøyaktig det du mente: en ny upstream-blokk, et oppdatert proxy_pass-mål, en TLS-cipher-suite-bytte. Diffen fanger det utilsiktet manglende semikolonet hver gang.
Auditere en systemd-unit eller supervisord-config
En tjeneste starter på nytt i loop etter en deploy. Diff den fungerende foo.service mot den nye, og du finner vanligvis årsaken innen tretti sekunder: et endret ExecStart, en bortfalt Environment=-linje, et strammet NoNewPrivileges. Samme flyt for supervisord-.conf-blokker, runit-run-skript og de ulike .ini-aktige init-configene man fortsatt ser på eldre maskiner.
Sammenligne infrastructure-as-code-config-filer
Terraform-variabler i terraform.tfvars, Pulumi-stack-configer, Ansible-group_vars, Helm-values for Kubernetes ConfigMaps. Hvert miljø har sin egen kopi, og den eneste trygge måten å merge dem på er å diffe. Lim inn prod mot staging og driften hopper frem: en region pinned til us-east-1 i den ene og us-west-2 i den andre, en instance-type noen hevet under en hendelse og aldri rullet tilbake, et IAM-role-ARN som peker på feil konto.
Sjekke at en CI-environment-fil samsvarer med den dokumenterte malen
En ny ingeniør starter, kopierer .env.example fra repoet, og buildet faller fortsatt på hennes første PR fordi malen har drevet fra det CI-pipelinen faktisk forventer. Diff den committede .env.example mot en kjent-god .env fra noen hvis builds går igjennom, og de manglende nøklene dukker opp som rødt til venstre eller grønt til høyre. Samme triks fungerer for Taskfile-env-blokker, GitHub Actions env:-seksjoner og direnv-.envrc-filer.
Hurtigreferanse for config-formater
Et kort jukseark over formatene dette verktøyet ser oftest. Konfigurasjon er rotete enn ryktet antyder, og forskjellene under er der de fleste differ kjører av sporet.
| Topic | What this tool does |
|---|
| Format-dialekter | INI (ingen formell spec, dialekter per parser), TOML 1.0 (stram, typed), .env (ingen spec, parser-definert), .properties (Java, se java.util.Properties), .conf (per applikasjon: nginx, Apache, sshd_config er alle forskjellige). |
|---|
| Kommentartegn | INI: ; eller #. TOML: bare #. .env: bare #, og bare i starten av linjen i de fleste loaders. .properties: # eller !. nginx .conf: bare #. |
|---|
| Seksjonshoder | INI og TOML bruker [section]. TOML legger til nestede tables via [a.b.c] og arrays av tables via [[a]]. .env og .properties er flate, uten seksjoner. nginx bruker { ... }-blokker i stedet for hoder. |
|---|
| Verditypber | TOML har typede verdier: strenger, ints, floats, bools, datoer, arrays, tables. INI, .env og .properties er bare streng; applikasjonen bestemmer hvordan true eller 42 skal parses. |
|---|
| Interpolasjon og utvidelse | De fleste dotenv-loaders utvider ikke $VAR som standard. Noen gjør (dotenv-expand, direnv, shell-sourcing via source .env). TOML utvider aldri. INI sjelden; Pythons configparser støtter ${section:key} hvis du opt-in:er. |
|---|
| Blanktegn på slutten | En reell buggkilde. FOO=bar med et etterfølgende mellomrom setter FOO til "bar " i de fleste loaders, noe som feiler streng-likhetssjekker nedstrøms. Trim alltid eller siter. |
|---|
| Linjeskift | CRLF (Windows) vs LF (Unix). To identiske filer lagret på forskjellige OS-er diffes som hver-linje-endret. Bruk Format-knappen eller normaliser linjeskiftene (dos2unix, git config core.autocrlf) før diffing. |
|---|
| Encoding og BOM | TOML krever UTF-8. .properties krevde historisk ISO-8859-1 med \uXXXX-escapes, men moderne Java aksepterer UTF-8 via Properties.load(Reader). En UTF-8 BOM i starten av en .env er en klassisk spøkelses-diff-årsak; Notepad på Windows skriver fortsatt en som standard. |
|---|
Config-diff: ofte stilte spørsmål
Forstår verktøyet verditypber?
Nei. Det er en tekst-diff. TOML skiller strenger, integers, floats, booleans, datoer og arrays, men diffen behandler hver linje som vanlig tekst og viser hvilke tegn som er endret. Det er vanligvis greit fordi konfigurasjonsendringer er tegnendringer uansett. Trenger du virkelig en typed sammenligning, parse begge filene i ditt foretrukne språk (Pythons tomllib, Rusts toml-crate, Gos pelletier/go-toml) og sammenlign de resulterende mappene. For 95%-tilfellet fanger tekst-diffen det du må fange.
Hvordan håndterer jeg utkommenterte linjer som "skiller seg" men er ekvivalente?
Det gjør du vanligvis ikke, og du bør være glad for at verktøyet flagget det. En linje som går fra API_KEY=abc til #API_KEY=abc er semantisk meningsfull: nøkkelen er nå deaktivert. Diffen fremhever kommentar-prefiks-endringen, som er nøyaktig det en menneskelig reviewer bør se under en config-gjennomgang. Vil du virkelig ignorere kommentar-støy, formater begge sider for å droppe rene kommentarlinjer før innlimning, men det er sjelden riktig trekk for en sikkerhetsrelevant fil.
Hvordan sjekker jeg om en nøkkel mangler på den ene siden?
Lim inn begge filene, kjør diffen, og enhver nøkkel som finnes på den ene siden og mangler på den andre, dukker opp som en rød sletting eller en grønn innsetting av hele linjen. Diffen prøver ikke å justere nøkler strukturelt, så en nøkkel omarrangert til en annen posisjon dukker opp én gang som sletting og én gang som innsetting. For en helt rekkefølgeuavhengig sammenligning, sorter først begge filer på nøkkel (sort .env på Unix) og diff deretter. Den formatagnostiske tilnærmingen fanger manglende nøkler uten å trenge en parser.
Er det trygt å lime inn .env-filer med ekte secrets?
Ja, inputen din forlater aldri nettleseren. Diffen kjører helt på klienten. Ingen serveropplasting, ingen telemetri på panelinnhold, ingen analytics som fanger det du skrev. Det er med vilje, fordi .env-differ er blant de mest tillitskrevende flytene på denne siden. Er du paranoid (og det bør du være litt), åpne nettleserens devtools og bekreft at nettverksfanen forblir tom mens du limer inn. For organisasjoner som foretrekker et helt air-gapped verktøy: åpne siden offline én gang, og de cachede ressursene fungerer uten ytterligere nettverkstilgang.
Hva er forskjellen mellom TOML og INI?
INI er en konvensjon; TOML er en spesifikasjon. INI vokste opp på Windows, har ingen formell grammatikk, og hver parser håndterer kanttilfeller (quoting, escapes, listeverdier, nestede seksjoner) litt forskjellig. TOML 1.0 er en stram, versjonert spec brukt av Cargo, Poetry, Hugo og i økende grad Python-pakking via pyproject.toml. Begge bruker [section]-headers og key = value-par, så de ser like ut ved første blikk, men TOML legger til typede verdier, datetime-literaler og inline tables som klassiske INI-filer ikke har.
Normaliserer diffen nøkkel-store-bokstaver eller blanktegn?
Nei. API_KEY=abc og api_key=abc er forskjellige linjer for diffen fordi de er forskjellige bytes. De fleste loaders er også store-/små-bokstavsfølsomme (dotenv, java.util.Properties, configparser som standard), så dette samsvarer med virkeligheten. Blanktegn rundt = bevares som det er, noe som betyr noe fordi noen strammere parsere (særlig visse Bash-sourcing-mønstre) avviser FOO = bar med mellomrom og bare aksepterer FOO=bar. Format-knappen trimmer blanktegn på slutten av hver linje, og det er det eneste normaliseringssteget den anvender.
Personvern og hvordan dette fungerer
Konfigurasjonsfilene dine forlater aldri nettleseren. Diffen, formatereren og hver byte av inputen din blir lokalt på maskinen din. Ingen analytics på panelinnhold, ingen logger, ingen opplasting. Det betyr mer her enn på de fleste diff-verktøy fordi .env-filer rutinemessig inneholder database-passord, API-nøkler og OAuth-client-secrets, og å lime dem inn i et verktøy som sender dem fram og tilbake til en server, ville være en reell sikkerhetshendelse. Bakgrunnslesning om formatene: TOML 1.0, INI-filer og Unix-konseptet miljøvariabler. For secrets som ikke i det hele tatt bør leve i en fil, se på sops, HashiCorp Vault eller AWS Parameter Store.