Calcola il commit unito nel hook prepar-commit-msg


4

Ho provato a creare un prepare-commit-msg hook che funziona per l'unione di commit. Lo script riceve i seguenti argomenti .git/MERGE_MSG, merge.

Ho bisogno di ottenere il nome dell'hash o del ramo del commit unito (per un normale, non-polpo unione). So che posso farlo git rev-parse MERGE_HEAD per ottenere l'hash o name-rev --name-only MERGE_HEAD per ottenere il nome del ramo (se presente).

Tuttavia, sembra questo prepare-commit-msg viene chiamato prima che MERGE_HEAD venga creato. C'è un altro modo per sapere quale commit è stato unito a parsing del messaggio generato automaticamente?

Sto usando git 2.4.0.


Hai esaminato il contenuto del file .git/MERGE_MSG (che contiene fino ad ora il messaggio di commit)?
harrymc

Sì, è ciò che intendevo per "analizzare il messaggio generato automaticamente". Sembra essere una soluzione piuttosto hacky e fallibile.
Raphael Schweikert

Non so quanto sia hacky, ma lo scopo di questo hook è solo quello di personalizzare questo file.
harrymc

È fallibile perché l'utente potrebbe avere una versione localizzata di git che produce varianti non inglesi della frase "Unisci ramo x in y" (il che significa che non posso associare i nomi dei rami) quindi devo passare attraverso ogni valido nome del ramo (che è probabilmente ogni parola) nel messaggio generato automaticamente e controlla se quel ramo esiste realmente e non è identico a HEAD. Questo potrebbe anche dare dei falsi positivi.
Raphael Schweikert

Si può ottenere il nome del ramo tramite NAME=$(git branch | grep '*' | sed 's/* //') , ma non so se questo esiste durante prepare-commit-msg. Dovrebbe funzionare per commit-msg gancio. Un altro : git symbolic-ref --short HEAD.
harrymc

Risposte:


7

In un driver di unione personalizzato, il nome di il ramo che viene unito a (destinazione) può essere recuperato con git symbolic-ref HEAD e il nome del ramo che è stato fuso in (fonte) dal GITHEAD_<SHA> variabile d'ambiente,

Questo è un esempio di frammento di script:

# retrieve merged branch name from an env var GITHEAD_<sha>=<branchName> 
# we cannot use a sym ref of MERGE_HEAD, as it doesn't yet exist 
gitHead=$(env | grep GITHEAD) # e.g. GITHEAD_<sha>=release/1.43 
# cut out everything up to the last "=" sign 
source="${gitHead##*=}"

# retrieve base branch name from a sym ref of HEAD 
branch=$(git symbolic-ref HEAD) # e.g. refs/heads/master 
# cut out "refs/heads"
destination="${branch#refs/heads/}"

echo "Merging from $source into $destination"

Fonte : Come recuperare i nomi delle filiali in un driver Git merge personalizzato? .


1
Grazie per questa grande risposta. Sono abbastanza sicuro stackoverflow.com/questions/24302644/... è la fonte canonica per questo. codedisqus.com è solo un mirror che strappa il contenuto di stackoverflow. Ma dal momento che hai rifiutato la mia modifica, la sto postando come commento.
Raphael Schweikert

Mi piacerebbe revocare la tua risposta, ma mi mancano 2 punti rep ... Ricordami di tornare quando li avrò.
Raphael Schweikert

Scusa, ero troppo veloce per rifiutare la tua modifica. È stato rifatto ora. Ho anche upvoted il tuo post. Grazie e buona fortuna.
harrymc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.