Come posso impedire agli utenti di unire origine / X a Y in git?

6

È possibile forzare git a unire i rami di monitoraggio remoto solo nel ramo locale corrispondente? Per esempio. supponiamo origine / X tracce X sull'origine e corrisponde a X locale e lo stesso per origine / Y e Y. Voglio impedire agli utenti di fare git checkout Y; git merge origin/X . È possibile? Come?

Modifica:

Per chiarire: il flusso di lavoro non è un problema. Le persone cercano di unire i rami sbagliati perché si sono dimenticati di eseguire il checkout del ramo corretto prima di unire. Non si tratta di "trasgressori" o di spingere al repository centrale. Sono solo le persone che si dimenticano di quale ramo sono. L'ultimo "incidente" è stato letteralmente:

"I should commit and push real quick before I leave.

git add .
git commit -am 'Feature Y'
git push origin

Whoops, whats that. It tells me to merge branch origin/X first. OK whatevs.

git merge origin/X

Whoops, whats that now. Lots of merge conflicts. What have I done. I better call somebody..."

L'utente stava lavorando nel ramo Y e non ha capito cosa stava dicendo git push origin . Diceva che l'origine / X necessitava della fusione e questo è quello che ha fatto, perché voleva "spingere molto in fretta". Nel caso sopra il ramo X c'era un commit davanti alla X locale, quindi spingendo tutti i rami ha prodotto l'errore "need merging".

Ho modificato il "flusso di lavoro" ora per inserire sempre un ramo in modo esplicito, ad es. git push origin Y invece di solo git push origin , ma questo non risolve il problema. Dovrebbe (di solito) non essere consentito senza un avvertimento per unire origine / X con Y. Per unire i rami di feature X e Y possono essere uniti.

    
posta EricSchaefer 07.08.2012 - 17:09
fonte

3 risposte

3

Dato che git è distribuito, non c'è modo di proibire agli utenti di farlo localmente, e non sono nemmeno sicuro se sia possibile con gli hook locali.

E poiché un utente non deve spingere tutti i riferimenti locali, non c'è modo di prevenirlo sul server.

Modifica

Stai parlando di errori. Git consente agli utenti di correggere i loro errori e annullare l'errore, ma questo richiede loro di notarlo. Come ho detto nei commenti, potresti provare a usare gli hook per questo, ma non c'è un hook di pre-unione o qualcosa del genere.

    
risposta data 07.08.2012 - 17:59
fonte
1

Penso che potresti esserti avvicinato da un angolo sbagliato.

Perché unire origin/X in Y è un problema? Se è perché, per esempio, Y è un ramo rilascio (che sta monitorando origin/Y ), mentre origin/X è un ramo sviluppo e tu Il codice di sviluppo che perde in una versione di produzione, quindi è più importante controllare origin/Y che controllare Y .

Come suggerisce Christopher in un commento, questo dovrebbe davvero essere curato dal tuo flusso di lavoro.

Per evitare errori, tuttavia, come Ikke sottolinea , potresti voler utilizzare le autorizzazioni per limitare chi può aggiornare diversi riferimenti remoti. Ad esempio, gitolite consente un controllo di accesso a grana molto fine. Dall'eccellente Pro Git di Scott Chacon:

Gitolite allows you to specify permissions not just by repository, but also by branch or tag names within each repository. That is, you can specify that certain people (or groups of people) can only push certain "refs" (branches or tags) but not others.

Un'opzione consiste nel consentire al server di integrazione continua di inviare push ai rami di rilascio e solo dopo aver superato i test di integrazione e unità. Questo tipo di flusso di lavoro automatizzato può davvero aiutare a prevenire la propagazione degli errori.

    
risposta data 08.08.2012 - 16:44
fonte
1

Un modo è dare loro comandi alternativi. Uso raramente git merge ; invece, io uso le funzioni di bash qui sotto. Se utilizzi Windows (e non usi Cygwin), suppongo che potresti creare file batch per fare la stessa cosa.

function branch
{ 
    if [ $# == 0 ] ; then
        git branch | grep '^\*' | sed -e 's/.* //' ;
    elif git branch | grep -q " $1\$" ; then
        git checkout $1
    else
        git checkout master
        git checkout -b $1
    fi ;
}

function push
{
    src='branch'
    if [ $# == 0 ] ; then
        git push origin ${src} ;
    elif [ $# == 1 ] ; then
        git push $1 ${src} ;
    else
        git push $1 ${src}:${2} ;
    fi ;
}

function pull
{
    if [ $# == 0 ] ; then
        src='branch' ;
        git pull origin ${src} ;
    elif [ $# == 1 ] ; then
        branch $1
        git pull origin $1 ;
    else
        echo "usage: pull [BRANCH]" ;
    fi ;
}
    
risposta data 08.08.2012 - 19:56
fonte

Leggi altre domande sui tag