Hoe schrijf ik een pre-merge hook in Git?

De vraag zegt alles. Is er een manier om een ​​actie uit te voeren voor het samenvoegen? Ik vermoed dat er een manier is om gebruik te maken van een pre-commithook, maar ik weet het niet helemaal zeker.


Antwoord 1, autoriteit 100%

Je kunt proberen de prepare-commit-msghook te gebruiken. Het tweede argument is merge“als de commit een merge is of als er een .git/MERGE_MSGbestand bestaat”. Een exit-status die niet nul is, zal de vastlegging afbreken.

Ik denk niet dat dit zal werken met een fast-forward merge, aangezien er geen commit-bericht zal zijn.

Meer informatie over hooks: https://www .kernel.org/pub/software/scm/git/docs/githooks.html#_prepare_commit_msg


Antwoord 2, autoriteit 74%

Met Git 2.24 (Q4 2019), geen script-wrapper of ‘prepareer-message hook’ nodig.

Er is een nieuwe “pre-merge-commit” hook geïntroduceerd.

Zie commit bc40ce4, commit 6098817, Michael J Gruber (mjg).
Zie commit f78f6c7(07 aug 2019) door Josh Steadmon (steadmon).
(Samengevoegd door Junio ​​C Hamano — gitsterin commit f76bd8c, 18 sep 2019)

git-merge: eer pre-merge-commithook

git-mergerespecteert de pre-commit hook niet bij het automatisch samenvoegen
commits, en om compatibiliteitsredenen zal dit blijven.

Introduceer een pre-merge-commithook die wordt aangeroepen voor een automatische merge
commit net zoals pre-commit wordt aangeroepen voor een niet-automatische merge commit
(of een andere verplichting).

De documentatiebevat nu:

pre-merge-commit

Deze hook wordt aangeroepen door git-merge.
Er zijn geen parameters voor nodig en het wordt aangeroepen nadat de samenvoeging met succes is uitgevoerd en voordat het voorgestelde vastleggingslogbericht is verkregen om een ​​vastlegging te doen.
Afsluiten met een niet-nul status van dit script zorgt ervoor dat het git mergecommando afbreekt voordateen commit wordt gemaakt.

De standaard ‘pre-merge-commit’-hook, indien ingeschakeld, voert de ‘pre-commit’-hook uit, als deze laatste is ingeschakeld.

Deze hook wordt aangeroepen met de omgevingsvariabele GIT_EDITOR=:als het commando geen editor zal oproepen om het commit-bericht te wijzigen.

Als de samenvoeging niet automatisch kan worden uitgevoerd, moeten de conflicten worden opgelost en moet het resultaat afzonderlijk worden vastgelegd (zie git-merge).
Op dat moment wordt deze hook niet uitgevoerd, maar de ‘pre-commit‘ hook wel, als deze is ingeschakeld.


Antwoord 3, autoriteit 7%

Een andere goede oplossing zou zijn om een ​​shellscript toe te voegen, noem het zoals je wilt,
voeg dan deze regels toe aan het script:

git() {
    if [ "$1" == "merge" ]; then
        echo "seems to work like a charme"
    fi
    command git "$@"
}
git "$@"

Maak dan een

alias git="./my-pre-merge-script.sh"

Dan bent u klaar om te gaan. Je hebt zojuist je eigen pre-merge hook toegevoegd.
Ik weet dat je geen toegang hebt tot welke argumenten git dan ook zou doorgeven aan een echte pre-merge hook, maar je kunt nu bestanden voorbereiden of wat je maar wilt voorbereiden voor merge; Persoonlijk ben ik erg blij met deze aanpak: ik heb 2 of 3 hele dagen besteed aan het vinden van iets voor pre-merge, daarna moest ik het pre-commit-bericht gebruiken dat ik niet nauwkeurig genoeg vond voor mijn behoeften. Dit lost al mijn problemen op. Ik hoop dat dit iemand in de toekomst helpt.

Other episodes