Repositoryregels (.gitcito.json)
Elk project draagt regels met zich mee die je niet uit de code kunt afleiden.
Nooit rechtstreeks naar release/* pushen. Commit-scopes zijn api, web en
infra, en verder niets. Je hebt Node 20 nodig, uitgecheckte submodules en een
.env gekopieerd van .env.example voordat er iets draait. Die regels staan in
een README die niemand herleest, in een CI-fout, of bij degene die hier het
langst zit.
.gitcito.json is waar een repository ze opschrijft zodat de tool ernaar kan
handelen. Het bestand staat in de hoofdmap van de repository, wordt net als elk
ander bestand gecommit en reist dus mee met de kloon: iedereen die het project
opent krijgt dezelfde regels, en een nieuwkomer krijgt ze op dag één in plaats
van bij de eerste geweigerde push.
Het bestand is volledig optioneel. Een repository zonder gedraagt zich precies zoals altijd.
Je hoeft het niet met de hand te schrijven: de repository-chat krijgt het schema van dit bestand, dus voeg ticketlinks toe voor JIRA-1234 of bescherm de release-branches komt terug als een beoordeelbare bestandsactie.

Waar je het bewerkt
Het tandwiel naast het gereedschap in de werkbalk → Config. Die editor schrijft het bestand naar je working tree; het wordt nergens anders bewaard, dus commit het om de regels met het team te delen.
Heeft de repository er nog geen, dan stelt Lees de repository er een voor op
basis van wat er al is: een .nvmrc of engines.node, een .gitmodules,
filter=lfs in .gitattributes, een .env.example zonder .env ernaast, de
branches die je lokaal al beschermt, en de scopes die de laatste 500
commit-onderwerpen gebruiken. Er wordt niets geschreven tot je opslaat. Vanaf de
terminal doet gitcito config init hetzelfde (zie de opdrachtregel).
Wat het bestand kan zeggen
{
"version": 1,
"protect": ["main", "release/*"],
"links": {
"tickets": [
{ "match": "\\b[A-Z][A-Z0-9]+-\\d+\\b", "url": "https://tracker.example.com/browse/$0", "label": "Jira" }
]
},
"commit": {
"scopes": ["api", "web", "infra"],
"ticketFromBranch": true,
"trailers": ["Refs: {ticket}"]
},
"requires": {
"node": ">=20",
"hooksPath": ".husky",
"submodules": true,
"lfs": true,
"files": [{ "path": ".env", "from": ".env.example", "why": "API-basis-URL en een dev-token" }]
},
"checklist": {
"push": ["Draai de integratiesuite tegen staging"]
}
}
| Veld | Wat het doet |
|---|---|
version |
Moet 1 zijn. Een bestand uit een nieuwer schema wordt in zijn geheel genegeerd in plaats van geraden. |
protect |
Branchnamen, waarbij * op elke reeks tekens past. Wordt toegevoegd aan de branches die je lokaal beschermt — zie beschermde branches. |
links.tickets |
Een reguliere expressie en een URL-sjabloon. $0 is de hele match, $1…$9 zijn groepen. Matches in commit-onderwerpen en -teksten worden links. |
commit.scopes |
De scopes die de composer aanbiedt, in plaats van een vrij tekstveld. Ze declareren maakt van een onbekende scope in gitcito commit-check bovendien een fout in plaats van stijladvies. |
commit.ticketFromBranch |
Vult de ticketsleutel in vanuit de branchnaam (feature/ABC-123-iets → ABC-123) — maar alleen in een lege composer, nooit over iets dat je aan het typen bent. |
commit.trailers |
Regels die aan de commit-tekst worden toegevoegd. {ticket} en {branch} worden ingevuld; een regel waarvan de plaatshouder niets te vullen heeft wordt weggelaten in plaats van halfslachtig geschreven. |
requires.* |
Wat een werkende kloon nodig heeft. Elke regel wordt hieronder een doctor-rij. |
checklist.push |
Vrije tekst, één keer per sessie getoond vóór de eerste push. |
De doctor
requires is het deel dat antwoord geeft op "ik heb het gekloond en het draait
niet". Gitcito controleert het bij het openen van de repository en toont een
stethoscoop-chip in de statusbalk als er iets mis is. Klikken opent het tabblad
Config bij de doctor-rijen; Opnieuw controleren draait ze nog eens.
| Controle | Slaagt wanneer | Herstel via |
|---|---|---|
node |
De node in je PATH voldoet aan de specificatie |
— |
submodules |
Geen enkele submodule mist een checkout | git submodule update --init --recursive |
lfs |
git-lfs is geïnstalleerd en getrackte bestanden zijn echte inhoud, geen pointertekst | git lfs pull |
hooksPath |
core.hooksPath komt overeen met het opgegeven pad |
core.hooksPath instellen |
files |
Het bestand bestaat | het kopiëren vanaf from, als dat bestaat |
Twee bewuste grenzen. Een waarschuwing betekent nooit "kapot" — het betekent
dat de doctor iets niet kon vaststellen (een onleesbare Node-specificatie slaagt
in plaats van een fout te verzinnen waar je niets mee kunt), en waarschuwingen
laten gitcito doctor in CI niet falen. En een herstelactie komt nooit uit het
bestand: de set hierboven is de hele set, gesloten bij het compileren. De
configuratie geeft er een waarde aan — een pad om te kopiëren, een waarde voor
core.hooksPath — en nooit een commando.
Kopiëren overschrijft nooit: dat het bestand ontbreekt is precies de reden dat die rij er staat.
Commits
Met commit.scopes gedeclareerd biedt de scope-knop van de composer die lijst in
plaats van een vrij tekstveld — het verschil tussen feat(renderer) en
feat(rendererr). ticketFromBranch en trailers vullen de mechanische delen
van een bericht in, en links.tickets maakt van de sleutels weer links overal
waar een commit wordt getoond.
Dezelfde regels gelden buiten het venster: gitcito commit-check leest dit
bestand, zodat een commit-msg-hook en CI precies afdwingen wat de composer
voorstelt. Zie de opdrachtregel en committen.
De pushlijst
checklist.push verschijnt als bevestiging vóór de eerste push van een sessie,
één regel per item. Het is de plek voor wat echt een afweging is — heeft iemand
support ingelicht? — want Gitcito controleert ze nooit voor je. Het zijn
herinneringen, geen poorten: lezen en pushen, of annuleren. Eén keer per
repository per sessie, want een dialoog bij elke push is een dialoog die niemand
leest.
Waarom het je geen kwaad kan doen
Het bestand komt met de repository mee, en dus van wie de repository schreef. Het wordt behandeld als niet-vertrouwde inhoud, niet anders dan een commit-bericht:
- Er draait niets uit. Er is geen veld dat een commando bevat, en de herstelacties van de doctor zijn een vaste lijst.
- Het kan alleen beperkingen toevoegen.
protectis een unie met je lokale lijst — een repository kan méér beschermen dan jij koos, je nooit ompraten om iets níet te beschermen. Geen enkel veld zet een waarborg uit. - Paden kunnen de repository niet verlaten. Absolute paden,
..,~, stationsletters en alles wat.gitraakt worden geweigerd, en nogmaals gecontroleerd op het punt waar een string een echt pad wordt. - Links moeten
http(s)zijn. Niets anders wordt aan de URL-opener van het systeem gegeven. - Alles heeft een limiet — lengte van lijsten, strings en patronen — zodat een vijandige repository geen muur van tekst in een dialoog en geen duizend chips in een paneel kan plakken.
Een fout veld wordt weggelaten, niet fataal. De rest van het bestand geldt nog
steeds, en wat is weggelaten staat met reden onder Genegeerd door Gitcito in
het tabblad Config. De enige uitzondering is ongeldige JSON of een onbekende
version, waar niets te redden valt.
Wat het bewust niet doet
- Geen commando's, geen scripts, geen hooks. Daar zijn hooks voor, en die zijn een beslissing per kloon.
- Geen regels per branch of per persoon. Eén bestand, één set regels.
- Het vervangt CI niet. De lijst is tekst; de doctor controleert de omgeving, niet je werk.
- Het kan niets verzwakken. Elke waarborg van Gitcito blijft van jou.
Zie ook: Instellingen per repository · De opdrachtregel · Committen · Hooks & .gitignore