Claude Code git-hooks kan stoppa hemligheter, tvinga formatering, köra rätt tester och skriva korta commit-sammanfattningar för snabbare granskningar.

De flesta problem i granskningar kommer inte från "svår" kod. De kommer från undvikbara misstag som smyger sig in i en commit: en debug-flagga kvar, en oformaterad fil som skapar bullriga diffs, ett test som inte uppdaterats, eller en hemlighet som kopierats in i en konfig. Var och en är liten, men ihop förvandlar de en enkel granskning till ett långsamt fram-och-tillbaka.
Commit-tid automation är det enklaste stället att stoppa det. När kontroller körs precis innan en commit skapas fångar de problem medan ändringen fortfarande är färsk i ditt huvud. Att åtgärda ett misstag tar sekunder eftersom du redan är i kontexten för jobbet. Jämför med att hitta det två dagar senare i en pull request, efter fler commits och när granskaren måste fråga vad som hände.
Git-hooks är ett praktiskt verktyg för detta eftersom de körs lokalt, utan att vänta på CI. Men de är ingen magi. Hooks kan hoppas över, vara felkonfigurerade eller inkonsekventa över maskiner om teamet inte standardiserar dem. De kan heller inte garantera kvalitet på egen hand. Tänk på dem som räcken, inte portar.
Där hooks hjälper mest är att förebygga ”review tax”, det repetitiva, lågvärdiga feedback som hela tiden återkommer. Vanliga exempel är känsliga strängar som ser ut som tokens, formatterings- och lint-brus, grundläggande "körde du rätt tester?"-kontroller, och små kontextsammanfattningar som hjälper en granskare förstå avsikten.
Här passar Claude Code git-hooks bra: de kan göra det tråkiga verifikationsarbetet och lägga till lite mänsklig-läsbar kontext exakt vid commit-tid.
Att sätta förväntningar är viktigt. Håll lokala hooks snabba och förutsägbara så folk inte hatar dem. Snabba kontroller hör hemma på din laptop; långsamma kontroller hör hemma senare. En bra uppdelning är sekunder vid commit-tid och minuter i CI. Om en hook regelbundet tar så lång tid att någon når efter "skip", slutar den skydda ditt repo.
Ett enkelt exempel: du ändrar en modul och refaktorerar några funktioner. Utan automation ser en granskare 400 flyttade rader, inga nämnda tester och måste fråga grundläggande frågor. Med commit-tid-kontroller är commiten formaterad, ett relevant testset har körts och commit-meddelandet innehåller en kort sammanfattning. Granskningen börjar där den borde: på designen, inte städningen.
Git-hooks är bra för enkla kontroller, men de brukar stanna vid ja/nej-regler: "är filen formaterad?" eller "körde du linter?". Claude Code kan lägga till ett lättvindigt lager av omdöme genom att läsa din staged diff och några relaterade filer, och sedan fatta beslut som bättre matchar hur människor granskar ändringar.
Med Claude Code git-hooks kan hooken titta på vad du faktiskt ändrat, inte bara vad som finns i repot. Det gör automationen mer selektiv. Den kan fokusera på berörda moduler, redigerade konfigfiler och nya miljövariabler, istället för att behandla varje commit som en full build.
Praktiska uppgifter där ”läs diffen och tänk” lönar sig:
Begränsningar spelar roll eftersom en långsam hook blir en hook som hoppas över. Håll målet litet: lägg till räcken som fångar vanliga misstag tidigt, inte ett andra CI-system på varje commit.
En bra regel är: om det inte kan avslutas på några sekunder hör det förmodligen hemma i CI eller en pre-push-hook. Många team kör snabba lokala kontroller vid commit-tid och lämnar tyngre testsuiter till senare.
Planera för felställen. Om ett modell-anrop timear ut, bestäm om commiten ska blockeras eller falla tillbaka till en enklare kontroll. En fallback håller arbetsflödet förutsägbart och undviker att folk lär sig stänga av hooks.
Vissa setup:ar anropar en hostad modell; andra kör i en mer isolerad miljö. Bestäm vilken kod som kan lämna utvecklarmaskinen (om någon) och begränsa vad du skickar. Den staged diffen plus en liten uppsättning refererade filer är ofta tillräckligt.
Om du jobbar med känsliga repo:ar, var tydlig med var analysen körs och vad som loggas. Ett konkret exempel: om en commit lägger till ett nytt config-värde som STRIPE_SECRET=..., kan hooken stoppa commiten, förklara vad som ser riskabelt ut och föreslå att flytta det till en secret manager eller lokal env-fil innan det når fjärrrepon.
Git-hooks är bara användbara om folk behåller dem och inte börjar frukta commits. Tricket är att välja rätt hook för rätt jobb och hålla allt långsamt utanför den varma vägen.
En enkel karta över var kontroller vanligtvis hör hemma:
pre-commit: snabba, lokala kontroller som blockerar uppenbara problem (formatering, secrets-scan, snabb lint)commit-msg: kontroller som bara behöver meddelandet (ticket-ID, längd, konventionellt format)pre-push: tyngre arbete som ändå är värt att fånga innan det når delat repo (långsammare tester, typkontroller, build)När du lägger till Claude Code git-hooks, behandla dem som en hjälpsam granskare som dyker upp direkt, inte en flaskhals. Lägg allt som behöver nätverksanrop, fulla testsuiter eller lång analys i pre-push eller CI, inte pre-commit.
Ett praktiskt sätt att avgöra vad som körs var är att sortera kontroller efter hastighet och genomslag. Om det fångar hög-risk-problem (som läckta nycklar) och kan köras på en eller två sekunder hör det hemma i pre-commit. Om det tar 30–90 sekunder, flytta det till pre-push eller kör det bara när vissa filer ändras.
Team behöver också en tydlig hållning kring verkställighet. För ett enmansrepo kan opt-in-hooks vara okej. För ett teamrepo är det vanligt att tvinga det grundläggande (secrets, formattering, commit-meddelanderegler) och hålla tyngre kontroller rådgivande lokalt, medan CI är den slutliga grinden.
Hook-utdata spelar större roll än man tror. En hook som misslyckas bör säga vad som hände och vad man gör härnäst. Håll meddelanden korta och specifika. Visa exakt fil och rad när möjligt, ge ett tydligt fix-kommando, förklara hur man kringgår bara för verkliga nödlägen (och när man inte ska), och undvik stora loggar om inte användaren ber om "verbose."
Exempel: om du exporterar ett projekt från Koder.ai och börjar committa lokalt, kan en snabb pre-commit-hook fånga en kopierad API-token omedelbart, medan pre-push kör den långsammare "bara tester för ändrade moduler" innan någon annan ser branchen.
En hemlighet är allt som låter någon agera som du eller få åtkomst till privata system. Tänk API-tokens, OAuth-client-secrets, molnnycklar, databaslösenord, privata webhook-URL:er, signeringsnycklar och även "temporära" testuppgifter. En enda oavsiktlig commit kan hamna i en fork, ett CI-logg eller som en inklistrad diff — då är den inte längre temporär.
Den enklaste vinsten är att skanna bara det du är på väg att commita. En hook bör kontrollera staged changes (index), inte hela repot. Det håller det snabbt och undviker brus från gamla filer du inte rört. Det gör också feedbacken rättvis: "denna commit innehåller ett problem" istället för "ditt repo har en gång haft ett problem."
Vanliga saker att flagga tidigt inkluderar hög-entropi-tokens (långa slumpartade strängar), kända nyckelformat (AWS-nycklar, GitHub-tokens, JWTs), mönster som password=... eller api_key: ... i config, privata URL:er med inbäddade credentials och .env-filer eller kopierade produktionskonfigar.
Falsklarm händer, särskilt med testdata, hashar eller exempel i dokumentation. Bygg in en allowlist så folk kan gå vidare utan att inaktivera hela kontrollen. Håll allowlisten snäv: exakta filvägar för fixtures eller explicita markörer som "dummy" eller "example" som din detektor känner igen.
När en hemlighet hittas, misslyckas commiten med ett meddelande som berättar vad utvecklaren ska göra härnäst. Claude Code git-hooks kan göra detta vänligare genom att producera en kort förklaring baserad på diffen, men nyckeln är klara, säkra nästa steg:
ERROR: Possible secret detected in staged file: config/app.yaml (line 12)
Reason: looks like an API token
Next steps:
1) Remove it from the change or move it to env vars
2) Rotate the token (assume it is compromised)
3) Re-stage and retry commit
If this is a false positive, add a narrow allowlist rule in .secrets-allowlist
Ett konkret exempel: någon uppdaterar en backend-konfig och lägger till en TEMP_API_KEY så en funktion funkar i dev. Hooken stoppar commiten, föreslår att flytta den till en miljövariabel och påminner om att rotera om den var riktig. Det är en liten avbrott som förhindrar en stor städning senare.
Formatteringskonflikter slösar granskarnas tid, men långsamma hooks är det snabbaste sättet att få hooks inaktiverade. Sweet spot är enkla regler, ett verktyg per språk och bara röra det som är på väg att committas.
Välj en formatterare per språk och gör den till sanningskällan. Två formatterare som inte håller med (eller en formatterare plus en linter som också omskriver kod) skapar bullriga diffs och ändlös churn. Håll det trist: en JS/TS-formatter, en Go-formatter, en Dart-formatter. Se sedan till att alla kör samma versioner så hook-utdata är stabil över maskiner.
Den största hastighetsvinsten är att formatera endast staged files. Att formatera hela repot vid varje commit är huvudorsaken till att team klagar på pre-commit. En staged-only-approach håller också diffen fokuserad på vad du ändrat, vilket är exakt vad granskare vill ha.
En praktisk uppsättning val som håller commits snabba:
Auto-fix vs fail är en team-preferens, men en blandad approach fungerar bra. Auto-fix är utmärkt för mekaniska ändringar eftersom det undviker "commit, fail, kör om, commit igen"-loopen. Att faila kan vara bättre när du vill att folk ska se problemet och välja en riktning. Om du failar, skriv ut en instruktion som vem som helst kan följa på 10 sekunder.
Standardisera småsaker som orsakar plattformsbrus. Radslut och trailing whitespace är vanliga bovar, särskilt när folk växlar mellan Windows, macOS och CI.
En enkel policy som sällan orsakar smärta:
Där Claude Code git-hooks kan hjälpa är i limmet: upptäcka vilka staged files som behöver vilken formatterare, köra dem i rätt ordning och förklara fel i enkelt språk. Till exempel, om någon stage:ar en Go-fil och en TS-fil kan hooken formatera varje med rätt verktyg, re-stage:a resultaten och sen skriva en kort notis som "2 files reformatted, no behavior changes". Granskare ser renare diffs och utvecklare känner sig inte straffade för att committa ofta.
En enkel regel gör commits säkrare utan att göra dem smärtsamma: kör bara de tester som matchar vad du faktiskt staged. När hooken tittar på staged diffen (inte din working tree) undviker den falska larm från halvfärdiga filer.
Börja med att upptäcka vilka områden som berörts. De flesta repos har redan en naturlig struktur: packages, services, appar eller moduler. En hook kan läsa git diff --cached --name-only och sedan mappa de sökvägarna till en liten uppsättning testkommandon.
Här är några mapping-regler som förblir begripliga när du återvänder senare:
web/ eller frontend/ -> kör npm test (eller det minsta riktade kommandot du har)api/ eller server/ -> kör backend-enhetstester (hoppa integration som standard)mobile/ -> kör snabba widget/enhetstester, inte fulla device-sviterdb/ eller migrations/ -> kör migration-lint plus en liten schema-checkshared/ -> kör shared package-tester, plus snabba konsumenterMed Claude Code git-hooks kan du gå ett steg längre: låta Claude titta på staged filnamn och föreslå ett minimalt testset, sedan kör hooken de kommandona. Håll dock slutgiltiga beslut regelbaserade så teamet kan förutse vad som händer.
Dela arbetsbördan mellan commit och push. Commits bör vara snabba så folk inte börjar kringgå hooks. Ett praktiskt mönster är:
Flaky och långsamma tester behöver en tydlig policy, annars blir hooken brus. Kom överens i teamet om vad som blockerar en commit vs vad som bara varnar. En fungerande approach är att blockera på tydliga fel (formatering, enhetstester som normalt är stabila), varna för kända flaky tester med ett kort meddelande och flytta långsamma sviter till push/CI. Om ett test är flaky, behandla det som en bugg: spåra, fixa och ta bort varningsläget så snart det är stabilt.
En bra diff är inte alltid lätt att granska. En kort commit-tid-sammanfattning kan göra en 10-minuters-läsning till en 2-minuters-koll, särskilt när ändringar berör flera filer eller inkluderar refaktorer.
Idén är enkel: när du kör git commit frågar din hook Claude Code att läsa den staged diffen och producera en 3–6-raders notis som svarar på de frågor granskare alltid har: vad ändrades, varför det ändrades, hur riskfyllt det är och hur det testades.
Håll utdata kort och konsekvent så granskare lär sig lita på den:
Du kan lägga detta direkt i commit-meddelandet (t.ex. som en kort footer) eller spara det i en fil som teamet kopierar in i pull request-beskrivningen. Commit-meddelande fungerar bra när du vill att kontexten ska följa med ändringen. En separat fil fungerar bättre om teamet föredrar rena, konventionella commit-subjekt.
Ett sammanfattningsverktyg bör vara striktare än en granskare. Innan du skickar någon diff-innehåll till modellen, filtrera bort rader som matchar mönster som API-nycklar, privata nycklar, tokens, .env-värden och credentials. Filtrera även vanliga headers och cookies om ditt repo innehåller fångad HTTP-trafik. När hooken hittar känsliga mönster kan den redigera raderna eller falla tillbaka till en generell sammanfattning som "credentials-related changes redacted".
Exempel: du uppdaterar ett billing-endpoint och rör tre filer. Den staged diffen är bullrig pga renames, men sammanfattningen säger: "Adds idempotency key handling for charge creation to prevent double billing. Reason: retries caused duplicate charges. Risk: medium (payment path). Testing: unit tests for billing service, manual request replay." Det är precis vad en granskare behöver, utan att läsa varje rad först.
Du fixar en liten bugg och ändrar en konfig i samma commit. Buggen är en enradig ändring i billing/tax.go. Konfigändringen uppdaterar config/staging.yaml till en ny endpoint.
Du kör git commit -am "Fix tax rounding". Dina Claude Code git-hooks startar och kör en snabb uppsättning kontroller i en förutsägbar ordning.
Först tittar secret-scan på vad som ändrats, inte hela repot. Den flaggar att staging-konfigurationen innehåller något som liknar en riktig API-nyckel.
ERROR: Possible secret detected in config/staging.yaml:12
Pattern: api_key=sk_live_...
Fix: remove the key and use an env var reference (e.g., API_KEY)
Override: set ALLOW_SECRETS=1 (not recommended)
Du ersätter värdet med en miljövariabelreferens och committar igen.
Nästa steg kör formatering endast där det spelar roll. Om din Go-fil inte är formaterad misslyckas det med en kort hint som "run gofmt on billing/tax.go". Du kör formatteraren och hooken passerar på sekunder.
Sedan kör testgrinden en riktad uppsättning. Eftersom du berörde billing/ kör den bara billing-unit-tester (inte hela sviten). Om ett test misslyckas visar hooken det exakta kommandot för att reproducera lokalt. Du fixar rounding-edge-casen och kör samma tester igen.
Slutligen genererar hooken en granskningssammanfattning från diffen. Den är kort och specifik, som:
Vad granskaren ser är en commit som redan är ren: inga läckta hemligheter, konsekvent formatering och tester som matchar ändringen. De får också en färdig sammanfattning, så de kan fokusera på logiken istället för att leta efter avsikt.
Det snabbaste sättet att få hooks att misslyckas är att göra dem smärtsamma. Om en hook tar tillräckligt lång tid för att bryta någons flöde kommer folk att kringgå den med --no-verify eller radera den. Håll allt tungt utanför pre-commit och kör det i CI eller på begäran.
En praktisk regel: pre-commit ska kännas som en stavningskontroll, inte en testsuite. Om du vill ha smartare kontroller från Claude Code git-hooks, använd dem för att avgöra vad som ska köras, inte för att köra allt.
Gör hooks snabba som standard och strikta endast när det behövs. Till exempel, kör snabb formatering + secret scan på varje commit, men kör tester bara för berörda moduler.
En enkel hastighetsbudget som fungerar bra:
pre-commit: 1 till 5 sekunder totaltcommit-msg: under 1 sekundpre-push eller CIAI är bra på förslag, inte policy. Om du ber en AI att "granska diffen" utan regler får du olika resultat varje gång. Definiera vad hooken måste göra (och vad den aldrig får göra). Till exempel: den kan generera en granskningssammanfattning, men den får inte omskriva kod om inte en formatter redan producerat deterministiska ändringar.
Många hooks av misstag skannar din working tree och misslyckas med commiten på grund av ändringar du inte staged. Det känns orättvist.
Undvik det genom att alltid använda staged-innehåll som input. Ett bra test: redigera en fil, stage bara halva och verifiera att hooken rapporterar bara vad som är staged.
Om varje commit triggar en varning blir varningarna brus. Finjustera mönster, lägg till allowlists för kända säkra strängar och sänk "maybe"-träffar till varningar med en klar fix.
Konkreta exempel: om din secret-scanner flaggar testnycklar i fixtures/, lägg till en regel för att ignorera den mappen, men fortsätt blockera riktiga nycklar i app-konfigfiler.
Om du vill att Claude Code git-hooks ska hjälpa utan att irritera teamet är målet enkelt: fånga riktiga problem tidigt, håll dig tyst när allt är normalt och håll commit-loopen snabb.
En praktisk checklista som fungerar för de flesta repos:
En liten detalj som ger mycket: gör granskningssammanfattningen likadan varje gång. En enkel mall räcker och tränar granskare att skanna snabbt.
Review summary:
- What changed: <1-2 bullets>
- Risky areas: <files/modules>
- Tests run: <command or “not run + why”>
Nästa steg som gör det lätt att adoptera:
Om du gillar att bygga verktyg i en chat-först-approach kan Koder.ai (koder.ai) vara användbart för att generera små hjälparskript runt dina hooks och iterera säkert med snapshots och rollback innan du exporterar källkoden till ditt repo.
Börja med de ständiga bovarna som slösar granskningsmöjlig tid:
Flytta allt långsamt (full testsvit, djup statisk analys) till pre-push eller CI.
En bra standard:
pre-commit för snabba kontroller som tittar på staged changes (secrets, formatting, snabb lint, selektiva enhetstester)commit-msg för commit-meddelanderegler (längd, format, ticket-id)pre-push för långsammare men fortfarande lokala kontroller (bredare tester, builds)Om en kontroll regelbundet tar mer än några sekunder, flytta den senare i flödet.
Se commit-time hooks som skyddsräcken, inte som enda enforcement.
En praktisk policy: hooks hjälper utvecklarna; CI skyddar huvudgrenen.
Skanna staged diffen (index), inte hela repot.
Behöver du en helrepo-skanning, kör den schemalagt eller i CI.
Blockera när träffen är högkonfidens (riktiga nyckelformat, privata nyckelblock, uppenbara password=-värden i config). Varning när det är oklart.
Lägg också till en snäv allowlist för kända säkra fall, till exempel:
DUMMY_KEY)Om folk ser konstant falsklarm kommer de att inaktivera hooken.
Formatera endast staged files och använd en formatter per språk.
Praktiska standarder:
Detta håller diffs rena utan att varje commit blir en lång omskrivning.
Karta berörda sökvägar till en liten uppsättning snabba testkommandon.
Exempel:
git diff --cached --name-onlypre-push eller CIDetta håller commits snabba men fångar vanliga regressionsfall tidigt.
Håll det kort och konsekvent (3–6 rader). En enkel mall:
Du kan lägga till detta i commit-meddelandet eller spara som textutskrift för PR-beskrivningen.
Redigera innan du skickar något till en modell och var konservativ.
.env-värden, privata nycklar, cookies eller auth-headersDela hellre mindre, särskilt i privata repo.
Gör hooks förutsägbara och snabba:
pre-commit)Om hooken känns opålitlig eller långsam, kommer utvecklare använda --no-verify.