gitignore
Je wil niet altijd alle data die je produceert bijhouden in versiebeheer. Dat hoeft ook niet. De file .gitignore
staat je toe bepaalde bestanden uit te sluiten.
Enkele voorbeelden van bestanden die je niet wil bijhouden:
tijdelijke bestanden die aangemaakt worden wanneer je een programma compileert
hiervan kom je een voorbeeld tegen bij de compilatie van C#-programma's: voor je je eigen code uitvoert (dit is anders bij executables), worden er mappen
bin
enobj
aangemaakt. Deze bevatten data die nodig is om je programma uit te voeren, maar die volledig gegenereerd wordt uit jouw code.een voorbeeld hiervan vind je terug in de kennisclip
bestanden die specifiek zijn voor jouw systeem
voorbeeld: settingsbestand met daarin persoonlijke logingegevens
Omdat er in bijna elk project wel van die bestanden zijn, staat Git toe om ze uit te sluiten van versiebeheer. Dat betekent dat ze als het ware onzichtbaar zijn: ze kunnen alleen bestaan in de working directory en worden niet vermeld in berichten gegenereerd door Git.
Om een bestand te negeren, moet je eerst een bestand .gitignore
aanmaken. Je bestand moet dus letterlijk .gitignore
heten, dus met een punt als eerste karakter en zonder bestandsextensie. Daarin plaats je dan per regel de naam van een bestand dat niet meer zichtbaar mag zijn voor Git. Je kan ook namen van mappen schrijven (om alle bestanden in die mappen te negeren).
Wij zullen voorlopig .gitignore altijd in de root van onze boomstructuur plaatsen. Je kan ook .gitignore-bestanden in submappen plaatsen, maar dat is niet zonder gevolgen. Leer eerst de basis.
Weet je niet goed wat bedoeld wordt met "in de root"? Bekijk dan nog eens de uitleg over boomstructuren op de pagina over git init.
Verdere details
Je hebt bijvoorbeeld een bestand .gitignore dat er als volgt uitziet:
.gitignore:
Je files zien er bijvoorbeeld zo uit:
Als je dan de files a.txt, b.sql, c.html, d.svg, cache/urls.txt, cache/names.md maakt, dan kan je enkel c.html en .gitignore zelf verplaatsen naar de staging area (en van daar naar de projectgeschiedenis). Van de map .git
hoef je je niets aan te trekken, je moet je geen geschiedenis van je geschiedenis bijhouden.
.gitignore sluit alleen untracked bestanden uit! Als a.txt bijvoorbeeld al deel uitmaakte van de projectgeschiedenis voor .gitignore is aangemaakt, blijft a.txt deel uitmaken van de projectgeschiedenis en kan je wijzigingen aan a.txt stagen en committen alsof er geen .gitignore was.
De rol van folderstructuur
Normaal gesproken matcht een patroon op elk niveau in de boomstructuur. Het maakt dus niet uit of een te negeren bestand in de root staat of in een submap. Veronderstel dat je hetzelfde bestand .gitignore
hebt als tevoren en volgende bestandenstructuur:
Met deze folderstructuur kan je .gitignore
, c.html
en f.pkg
(in de map bin/pkg
) stagen en committen. Je kan de files die in .gitignore vermeld zijn niet stagen en committen. Dus ook niet e.gv
, want die is een onderdeel van cache
!
De map pkg
zal dan weer genegeerd worden, want Git houdt geen rekening met lege mappen.
Demonstratie
maak de .gitignore file en de folderstructuur van hierboven na
run
git status -u
(details volgen later)run
git add --all
(omdat dit dus niet echt "alle bestanden" betekent)run
git status -u
Niet-letterlijke patronen
Het is niet altijd praktisch om elk bestand te benoemen dat je wil negeren. Soms heb je meer algemene regels nodig. Er zijn dan ook een aantal zaken die je kan noteren in .gitignore
die niet letterlijk gelezen worden als bestandsnamen. We geven hier slechts een kort overzicht van de meest voorkomende. Op termijn kom je misschien in een situatie waarin je meer nodig hebt. Dan kijk je best naar de officiële documentatie.
Commentaar
Soms wil je een woordje uitleg toevoegen om te zeggen wat de redenering achter een bepaald patroon is. Dan begin je een regel met een #
. Deze stemt niet overeen met een #
in de naam van een map of van een bestand, maar zorgt ervoor dat de regel niet bekeken wordt door het systeem. Als je toch ooit een bestand wil uitsluiten dat begint met een #
, kan dat door \#
te noteren in je .gitignore
.
Directory separator
Een /
geeft de grens tussen mappen aan. We noemen de /
daarom ook de directory separator (directory = map, separator = iets dat een scheiding aangeeft). Zo kan je bijvoorbeeld, met de mappenstructuur iets hoger op deze pagina, bin/cache
wel negeren en cache
net onder de root niet. Deze directory separator is geen letterlijk symboo,l want op Windows wordt de grens tussen mappen aangegeven met een \
, dus een backslash, maar toch schrijven we in .gitignore
een /
.
Asterisk
Soms wil je hele groepen bestanden negeren op basis van hun naam of bestandsextensie. Je hebt misschien een reeks .pdf
bestanden met gegenereerde documenten. In de plaats van document1.pdf
,... kan je beter alle .pdf
-bestanden in dat project negeren. Om dit te doen, schrijf je *.pdf
. Een *
matcht met alles, behalve een directory separator. In de praktijk kan het misschien lijken alsof *
ook matcht met een directory separator, maar dat is omdat, zoals eerder gezegd, een patroon matcht op elk niveau in de bestandenstructuur.
Verdere mogelijkheden
Zoals je ziet, kan .gitignore
soms wat puzzelwerk vragen. Bovendien zijn er nog veel meer mogelijkheden. Leer dus de mogelijkheden die we hier besproken hebben en zoek de rest op in de officiële documentatie wanneer je ze nodig hebt.
Last updated