2011-11-23 9 views
7

Sto iniziando a giocare con git hooks e mi piacerebbe crearne uno per impedire a uno sviluppatore di creare un nuovo ramo su uno specifico ramo. L'attuale processo nella nostra azienda è destinata ad assomigliare a questo:Git hook per impedire la creazione di nuovi rami da rami specifici

git checkout master 
git fetch 
git reset --hard origin/master 
git checkout -b [branch name] 
do awesome things. 

Tuttavia, di tanto in tanto quando si spostano rapidamente, alcuni sviluppatori finiscono per iniziare questo nuovo ramo da un pronti contro termine messa in scena. Quale causa di dolore.

Così, mi piacerebbe creare un gancio di interrompere quando uno sviluppatore inizia a creare un nuovo ramo, controllare ciò ramo sono su, e sia exit 1 se il ramo non è master (o semplicemente generalmente fermare l'azione se il nome del ramo è staging) o diversamente.

Edit:

Come cerco più su questo, mi rendo conto che voglio un gancio pre-out, che non sembra esistere. A meno che qualcuno non abbia un'idea migliore, procederò a stampare un avvertimento molto grande in un hook post-checkout se lo scenario sopra descritto dovesse passare.

+0

Anche in questo caso, perché si vuole evitare ramificazione? – jman

+1

Il nostro ramo di staging contiene un sacco di codice che non vorremmo essere spinto alla produzione, necessariamente. – hookedonwinter

risposta

0

Vorrei prendere questo sul lato repo benedetto. Se un dev ha avviato un ramo su qualcosa di diverso da un commit che è fuori dall'ultimo master, rifiuta la pressione del ramo. Possono correggere eliminando il master e premendo nuovamente. Assicurati che il tuo messaggio di errore sia sufficientemente descrittivo in modo che sappiano come correggere la loro situazione.

Inoltre, aggiornare il tuo padrone senza aver prima controllato con:

git fetch 
git push . origin/master:master 

Quindi creare un ramo della più recente maestro:

git checkout -b somecoolfeature master 

Non devi avere anche il tuo padrone locale fino ad oggi:

git fetch 
git checkout -b somecoolfeature origin/master 
do awesome stuff :) 
1

per il lato client è possibile creare un post -checkout hook che utilizza il ramo git - misto per vedere i rami uniti nel ramo corrente. Se il ramo che si desidera impedire dalla ramificazione viene unito nel ramo corrente, si genera l'errore.

Codice a Bach sarebbe simile a questa:

 
#!/bin/sh 

getBranchName() 
{ 
    echo $(git rev-parse --abbrev-ref HEAD) 
} 

getMergedBranches() 
{ 
    echo $(git branch --merged) 
} 

if [ "$(getBranchName)" != "dev" ]; then 
    if [[ $(getMergedBranches) == *"dev"* ]]; then 
     echo "Don't create branches from the dev branch!" 
     exit 1 
    fi 
fi