-
1. Aan die slag
- 1.1 Oor Weergawebeheer
- 1.2 Wat is Git?
- 1.3 Die Opdragreël
- 1.4 Git Installeer
- 1.5 Git klaarmaak vir eerste gebruik
- 1.6 Hulp Verkry
- 1.7 Opsomming
-
2. Git Basics
-
3. Git Branching
-
4. Git on the Server
- 4.1 Die Protokolle (The Protocols)
- 4.2 Git op 'n Bediener kry (Getting Git on a Server)
- 4.3 Jou Publieke SSH-sleutel Genereer (Generating Your SSH Public Key)
- 4.4 Die Bediener Opstel (Setting Up the Server)
- 4.5 Git Daemon
- 4.6 Slim HTTP (Smart HTTP)
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Derdeparty-gasheuroplossings (Third-Party Hosting Solutions)
- 4.10 Summary
-
5. Distributed Git
-
6. GitHub
-
7. Git Tools
- 7.1 Hersieningseleksie (Revision Selection)
- 7.2 Interaktiewe Voorbereiding (Interactive Staging)
- 7.3 Bêre en Skoonmaak (Stashing and Cleaning)
- 7.4 Ondertekening van Jou Werk (Signing Your Work)
- 7.5 Soek (Searching)
- 7.6 Herskryf van Geskiedenis (Rewriting History)
- 7.7 Reset Ontmystifiseer (Reset Demystified)
- 7.8 Gevorderde Saamsmelting (Advanced Merging)
- 7.9 Rerere
- 7.10 Ontfouting met Git (Debugging with Git)
- 7.11 Submodules
- 7.12 Bundeling (Bundling)
- 7.13 Vervang (Replace)
- 7.14 Die Stoor van Aanmeldbewyse (Credential Storage)
- 7.15 Summary
-
8. Customizing Git
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
10. Git Internals
8.3 Customizing Git - Git-hake (Git Hooks)
Git-hake (Git Hooks)
Net soos baie ander weergawebeheerstelsels, het Git 'n manier om pasgemaakte skrippe (scripts) te laat afgaan wanneer sekere belangrike aksies plaasvind. Daar is twee groepe van hierdie hake: kliëntkant en bedienerkant. Kliëntkant-hake word geaktiveer deur bewerkings soos vaslê (committing) en saamsmelt (merging), terwyl bedienerkant-hake op netwerkbewerkings soos die ontvang van gepushte vasleggings loop. Jy kan hierdie hake vir allerhande redes gebruik.
Installasie van 'n Haak (Installing a Hook)
Die hake word almal gestoor in die hooks subgids van die Git-gids.
In die meeste projekte is dit .git/hooks.
Wanneer jy 'n nuwe bewaarplek met git init inisialiseer, vul Git die hake-gids met 'n trop voorbeeldskrippe, waarvan baie op hul eie nuttig is; maar hulle dokumenteer ook die toevoerwaardes van elke skrip.
Al die voorbeelde is geskryf as dopskrippe (shell scripts), met 'n bietjie Perl bygevoeg, maar enige behoorlik genaamde uitvoerbare skrippe sal goed werk – jy kan dit in Ruby of Python skryf of watter taal jy ook al mee vertroud is.
As jy die gebundelde haakskrippe wil gebruik, sal jy hulle moet hernoem; hul lêername eindig almal met .sample.
Om 'n haakskrip te aktiveer, plaas 'n lêer in die hooks subgids van jou .git gids wat gepas genaamd is (sonder enige uitbreiding) en uitvoerbaar is.
Van daardie punt af behoort dit geroep te word.
Ons sal die meeste van die belangrikste haaklêername hier dek.
Kliëntkant-hake (Client-Side Hooks)
Daar is 'n hele paar kliëntkant-hake. Hierdie afdeling verdeel hulle in vasleggingswerkvloei-hake (committing-workflow hooks), e-pos-werkvloeiskrippe, en al die res.
|
Note
|
Dit is belangrik om op te let dat kliëntkant-hake nie gekopieer word wanneer jy 'n bewaarplek kloon nie. As jou doel met hierdie skrippe is om 'n beleid af te dwing, sal jy dit waarskynlik aan die bedienerkant wil doen; sien die voorbeeld in 'n Voorbeeld van 'n Git-Afgedwonge Beleid (An Example Git-Enforced Policy). |
Vasleggingswerkvloei-hake (Committing-Workflow Hooks)
Die eerste vier hake het te make met die vasleggingsproses.
Die pre-commit haak word eerste uitgevoer, selfs voordat jy 'n vasleggingsboodskap intik.
Dit word gebruik om die momentopname (snapshot) te inspekteer wat op die punt staan om vasgelê te word, om te sien of jy iets vergeet het, om seker te maak toetse loop, of om te ondersoek wat jy ook al in die kode moet inspekteer.
As dit nie-nul uitstaan (exiting non-zero) van hierdie haak, word die vaslegging gestaak, al kan jy dit omseil met git commit --no-verify.
Jy kan dinge doen soos om te kyk vir kodestyl (voer lint of iets ekwivalents uit), kyk vir agtereenvolgende witruimte (die verstellingshaak doen presies dit), of kyk vir gepaste dokumentasie oor nuwe metodes.
Die prepare-commit-msg haak word uitgevoer voordat die vasleggingsboodskap-redigeerder aangeskakel word, maar nadat die verstekboodskap geskep is.
Dit laat jou toe om die verstekboodskap te redigeer voordat die vasleggingsouteur dit sien.
Hierdie haak neem 'n paar parameters: die pad na die lêer wat die vasleggingsboodskap tot dusver hou, die tipe vaslegging, en die vaslegging SHA-1 as dit 'n geamendeerde (amended) vaslegging is.
Hierdie haak is oor die algemeen nie nuttig vir normale vasleggings nie; dit is eerder goed vir vasleggings waar die verstekboodskap outomaties gegenereer word, soos sjabloon-vasleggingsboodskappe, saamsmeltingsvasleggings (merge commits), saamgeperste vasleggings (squashed commits), en geamendeerde vasleggings.
Jy kan dit gebruik in samehang met 'n vasleggingsjabloon om programmaties inligting in te voeg.
Die commit-msg haak neem een parameter, wat weer die pad is na 'n tydelike lêer wat die vasleggingsboodskap bevat wat deur die ontwikkelaar geskryf is.
As hierdie skrip nie-nul uitstaan, staak Git die vasleggingsproses, sodat jy dit kan gebruik om jou projektoestand of vasleggingsboodskap te valideer voordat jy toelaat dat 'n vaslegging deurgaan.
In die laaste afdeling van hierdie hoofstuk sal ons demonstreer hoe om hierdie haak te gebruik om te kyk dat jou vasleggingsboodskap aan 'n vereiste patroon voldoen.
Nadat die hele vasleggingsproses voltooi is, loop die post-commit haak.
Dit neem geen parameters nie, maar jy kan maklik die laaste vaslegging kry deur git log -1 HEAD uit te voer.
Oor die algemeen word hierdie skrip gebruik vir kennisgewing of iets soortgelyks.
E-poswerkvloei-hake (Email Workflow Hooks)
Jy kan drie kliëntkant-hake opstel vir 'n e-posgebaseerde werkvloei.
Hulle word almal opgeroep deur die git am opdrag, so as jy nie daardie opdrag in jou werkvloei gebruik nie, kan jy veilig na die volgende afdeling oorslaan.
As jy pleisters (patches) oor e-pos aanvaar wat deur git format-patch voorberei is, dan kan sommige hiervan vir jou nuttig wees.
Die eerste haak wat uitgevoer word, is applypatch-msg.
Dit neem 'n enkele argument: die naam van die tydelike lêer wat die voorgestelde vasleggingsboodskap bevat.
Git staak die pleister as hierdie skrip nie-nul uitstaan.
Jy kan dit gebruik om seker te maak dat 'n vasleggingsboodskap behoorlik geformatteer is, of om die boodskap te normaliseer deur te hê dat die skrip dit ter plaatse redigeer.
Die volgende haak om te loop wanneer pleisters via git am toegepas word, is pre-applypatch.
Taamlik verwarrend word dit uitgevoer nadat die pleister toegepas is, maar voordat 'n vaslegging gemaak word, sodat jy dit kan gebruik om die momentopname te inspekteer voordat jy die vaslegging maak.
Jy kan toetse uitvoer of andersins die werkboom (working tree) met hierdie skrip inspekteer.
As iets ontbreek of die toetse nie slaag nie, staak die uitstaan van nie-nul die git am skrip sonder om die pleister vas te lê.
Die laaste haak om te loop tydens 'n git am bewerking is post-applypatch, wat loop nadat die vaslegging gemaak is.
Jy kan dit gebruik om 'n groep of die outeur van die pleister wat jy ingetrek het te ken te gee dat jy dit gedoen het.
Jy kan nie die pleisterproses met hierdie skrip stop nie.
Ander Kliënthake (Other Client Hooks)
Die pre-rebase haak loop voordat jy enigiets rebase en kan die proses tot 'n stilstand bring deur nie-nul uit te staan.
Jy kan hierdie haak gebruik om te verbied om enige vasleggings te rebase wat reeds gepush is.
Die voorbeeld pre-rebase haak wat Git installeer, doen dit, hoewel dit sekere aannames maak wat dalk nie ooreenstem met jou werkvloei nie.
Die post-rewrite haak word uitgevoer deur opdragte wat vasleggings vervang, soos git commit --amend en git rebase (hoewel nie deur git filter-branch nie).
Sy enkele argument is watter opdrag die herskrywing geaktiveer het, en dit ontvang 'n lys van herskrywings op stdin.
Hierdie haak het baie van dieselfde gebruike as die post-checkout en post-merge hake.
Nadat jy 'n suksesvolle git checkout uitgevoer het, loop die post-checkout haak; jy kan dit gebruik om jou werkgids behoorlik op te stel vir jou projekomgewing.
Dit kan beteken dat groot binêre lêers ingebring word wat jy nie onder weergawebeheer wil hê nie, dokumentasie outomaties gegenereer word, of iets langs daardie lyne.
Die post-merge haak loop na 'n suksesvolle merge opdrag.
Jy kan dit gebruik om data in die werkboom te herstel wat Git nie kan naspoor nie, soos toegangsregte (permissions) data.
Hierdie haak kan eweneens die teenwoordigheid valideer van lêers ekstern aan Git-beheer wat jy dalk wil hê ingekopieer moet word wanneer die werkboom verander.
Die pre-push haak loop tydens git push, nadat die afgeleë verwysings (remote refs) opgedateer is, maar voordat enige objekte oorgedra is.
Dit ontvang die naam en ligging van die remote as parameters, en 'n lys van te-word-opgedateerde verwysings deur stdin.
Jy kan dit gebruik om 'n stel verwysingsopdaterings te valideer voordat 'n push plaasvind ('n nie-nul uitgangskode sal die push staak).
Git doen afvalinsameling (garbage collection) van tyd tot tyd as deel van sy normale werking deur git gc --auto op te roep.
Die pre-auto-gc haak word opgeroep net voordat die afvalinsameling plaasvind, en kan gebruik word om jou te ken te gee dat dit gebeur, of om die insameling te staak as nou nie 'n goeie tyd is nie.
Bedienerkant-hake (Server-Side Hooks)
Benewens die kliëntkant-hake, kan jy 'n paar belangrike bedienerkant-hake as 'n stelseladministrateur gebruik om byna enige soort beleid vir jou projek af te dwing. Hierdie skrippe loop voor en na pushes na die bediener. Die pre-hake kan op enige stadium nie-nul uitstaan om die push te verwerp sowel as om 'n foutboodskap terug na die kliënt te druk; jy kan 'n push-beleid opstel wat so kompleks is as wat jy verlang.
pre-receive
Die eerste skrip om te loop wanneer 'n push van 'n kliënt gehanteer word, is pre-receive.
Dit neem 'n lys van verwysings wat vanaf stdin gepush word; as dit nie-nul uitstaan, word nie een van hulle aanvaar nie.
Jy kan hierdie haak gebruik om dinge te doen soos om seker te maak geen van die opgedateerde verwysings is nie-vinnig-voorwaarts (non-fast-forwards) nie, of om toegangsbeheer te doen vir al die verwysings en lêers wat hulle met die push wysig.
update
Die update skrip is baie soos die pre-receive skrip, behalwe dat dit een keer loop vir elke tak wat die stootder (pusher) probeer opdateer.
As die stootder probeer om na veelvuldige takke te push, loop pre-receive slegs een keer, terwyl update een keer loop per tak waarna hulle push.
In plaas van om van stdin te lees, neem hierdie skrip drie argumente: die naam van die verwysing (tak), die SHA-1 waarna daardie verwysing voor die push gewys het, en die SHA-1 wat die gebruiker probeer push.
As die update skrip nie-nul uitstaan, word slegs daardie verwysing geweier; ander verwysings kan steeds opgedateer word.
post-receive
Die post-receive haak loop nadat die hele proses voltooi is en kan gebruik word om ander dienste op te dateer of gebruikers in kennis te stel.
Dit neem dieselfde stdin-data as die pre-receive haak.
Voorbeelden sluit in om 'n lys te e-pos, 'n deurlopende integrasie-bediener (continuous integration server) in kennis te stel, of om 'n kaartjie-opsporingstelsel (ticket-tracking system) op te dateer – jy kan selfs die vasleggingsboodskappe ontleed om te kyk of enige kaartjies geopen, gewysig of gesluit moet word.
Hierdie skrip kan nie die push-proses stop nie, maar die kliënt ontkoppel nie voordat dit voltooi is nie, so wees versigtig as jy iets probeer doen wat lank kan neem.
|
Tip
|
As jy 'n skrip/haak skryf wat andere sal moet lees, verkies die lang weergawes van opdragreëlvlae; oor ses maande sal jy ons bedank. |