2010-11-03 34 views
14

Ho un modello di commit impostato per git e vorrei includere il nome del ramo corrente in esso. Io di solito istituito la filiale di essere il bug id, e mi avrebbe aiutato con la compilazione boilerplate come ad esempio:Incluso il nome del ramo corrente nel modello di commit

Bug : $BUG 

Come posso eseguire un tale sostituzione con il modello git commento?

+0

Oh, letto male che SRY :(È possibile impostare un alias per git commit, che prima trova il ramo corrente, lo scrive in un file temporaneo e chiama git commit con il parametro --template. – ZeissS

risposta

15

Probabilmente userò semplicemente il gancio prepare-commit-msg per aggiungerlo al file. Dalla pagina di manuale (collegata):

Questo hook viene richiamato da git commit subito dopo la preparazione del messaggio di log predefinito e prima dell'avvio dell'editor.

Sono necessari da uno a tre parametri. Il primo è il nome del file che contiene il messaggio del registro di commit. Il secondo è la fonte del messaggio di commit ... [messaggio, modello, unione, squash o commit] ...

Se lo stato di uscita è diverso da zero, il commit di git verrà interrotto.

Lo scopo del gancio è quello di modificare il file di messaggio a posto ...

È possibile ottenere il ramo corrente con git symbolic-ref HEAD.

È possibile ignorare del tutto i modelli e fare in modo che il gancio preceda/inserisca/accoda il nome del ramo. Il caso più semplice, aggiungendo, lo script è solo una riga shebang, quindi git symbolic-ref HEAD >> "$1". Usa il tuo metodo preferito se vuoi incorporarlo - più leggibile per spostare l'originale da parte, scrivere e aggiungere, ma il metodo collegato nei commenti funziona certamente anche.

Se si preferisce utilizzare un modello con segnaposti, è sufficiente fare qualcosa come sed -i "s/Bug : \$BUG/BUG : $(git symbolic-ref HEAD)/" "$1". Sono sicuro che puoi immaginare molte altre varianti.

Si potrebbe voler sopprimere questo comportamento per alcuni dei tipi di commit (quel secondo argomento) o anche solo accenderlo se il secondo argomento è "template", se si sta utilizzando l'approccio sostitutivo boilerplate.

+0

Grazie per la risposta, è azzeccato Per riferimento, sono riuscito ad anteporre la riga con le istruzioni da http : //stackoverflow.com/questions/54365/prepend-to-a-file-one-liner-shell –

+0

@Robert Munteanu tutte le possibilità che vuoi mettere la tua intera soluzione qui in una risposta, per il laz y? Lo sveggerei di sicuro :) Grazie ... –

+1

@Yar: Personalmente, preferirei avere qualcosa di leggibile con un file temporaneo rispetto a qualche maga descrittore di file che devo cercare di decifrare più tardi. 'mv" $ 1 "" $ 1.tmp "; git symbolic-ref 2>/dev/null> "$ 1"; cat "$ 1.tmp" >> "$ 1"; rm "$ 1.tmp " – Cascabel

0

Solo raccogliendo i commenti dalla risposta di Jefromi, finisco con qualcosa di simile. Sicuramente potrebbe essere più stretta (se sapevo quello che stavo facendo):

tempFile='/tmp/git-commit-template' 
git config commit.template "$tempFile" 
rm $tempFile 
branch=$(git symbolic-ref HEAD|sed s#refs/heads/##) exec 3<> "$tempFile" && awk -v TEXT="[$branch]" 'BEGIN {print TEXT}{print}' "$tempFile" >&3 
git add . 
git commit -a 
1

Una soluzione che utilizza git alias ma nessun modello:

$ git config --global alias.com '!sh -c "bug=`git symbolic-ref HEAD|sed s#refs/heads/##`; git commit -em \"BUG: \${bug}\""' 
$ git com 
Problemi correlati