2010-10-30 13 views
6

Vorrei poter mantenere due rami separati in un repository git che non possono essere accidentalmente uniti anche se i rami possono contenere contenuti simili.C'è un modo per tenere uniti due rami in git

C'è un trucco per forzare un ramo a rimanere separato in git? Questo presuppone che io abbia il ramo A e il ramo B, qualcosa come git merge B //assuming A is checked out fallirebbe.

La preoccupazione qui è sorto perché nella creazione di un repository di un sito web che sto sviluppando ho bisogno della HEAD del maestro ramo di essere sempre lo stato corrente del sito stabile.

Qualsiasi sviluppo si impegna ho bisogno di verificarsi sul ramo sviluppo con argomento rami off del ramosviluppo, se necessario.

C1-C2      master 
    \ 
    C3-C4-C5-C6-C9-C10-C11 development 
       \ 
       C7-C8-C12  topic/HEAD 

Ho bisogno di assicurarmi che ci siano poche possibilità di una fusione accidentale tra il ramo principale e altri rami.

Quindi sto cercando un modo per passare "tra" un'unione con il ramo principale per chiedere "Questa fusione verrà pubblicata sul sito, sei sicuro di volerlo fare?" E solo dopo aver confermato l'unione, passerà attraverso.

Immagino che questo scenario sia rilevante solo per gli sviluppatori web con codice che non ha bisogno di essere compilato per poter essere eseguito, e può estrarre copie del sito web stabile su un'installazione live.

+0

Un altro modo per impedire che le cose vengano rese improvvisamente in diretta sarebbe quello di intercettarle mentre vengono spinte o distribuite. Un'unione nel repository di un dato dev non è necessariamente una cosa negativa, a seconda del flusso di lavoro. – Cascabel

risposta

5

Credo che l'unico modo per ottenerlo sia con uno pre-commit hook. Dalla pagina di manuale:

Questo hook è invocato da git commit e può essere ignorato con l'opzione --no-verify. Non richiede alcun parametro e viene richiamato prima di ottenere il messaggio di registro di commit proposto e di eseguire un commit. Uscendo con uno stato diverso da zero da questo script, il commit git si interrompe.

Quindi, se si vuole veramente, è possibile scrivere un pre-commit hook che controlla il ramo corrente e il ramo si sta cercando di unire, ed esce con stato diverso da zero se è la coppia di don non voglio Al di sopra della mia testa, l'unico modo in cui posso pensare di controllare quale ramo si sta tentando di unire è esaminare il file .git/MERGE_MSG e analizzare la prima riga. (L'alternativa, .git/MERGE_HEAD ti dirà SHA1 che stai unendo, ma senza alcuna registrazione di quale ramo era, quindi se due rami sono nello stesso posto, sei sfortunato.

Il pre-commit Ovviamente non è possibile eseguire l'hook per le unioni veloci, ma dubito che ci sia davvero un modo per proteggersi da questo, ma presumibilmente se si mantengono uniti i rami, non ci sarà mai un tentativo di avanzamento rapido

+0

Avevo sentito che esiste un modo per creare un ramo senza genitori. Mi chiedo se si tenta di unire due rami senza genitore (come il master e un altro) se questo fallirebbe automaticamente, anche senza un gancio (anche se immagino che non impedirebbe un rebase). – dkinzer

+0

Sì, è possibile creare più commit principali e, quindi, rami senza antenati comuni, ma ciò non impedirebbe che si verifichino fusioni. Significa semplicemente che non può esserci un'unione completa a tre sensi basata su un antenato comune. (Il caso di uso comune è che incorpora un altro repository per unione secondaria.) – Cascabel

+0

P.S. Se stai pensando a rami senza una storia comune, questo solleva la domanda sul perché li vuoi nello stesso repo in primo luogo. – Cascabel

4

Nota che un git merge con auto-commit sarebbe non chiamata il gancio pre-commit. Vedere "git merge auto-commit doesn't fire pre-commit hook"

Unisci chiama direttamente commit_tree, quindi i ganci di commit standard vengono ignorati.

A Patch è in corso.

+1

Questa patch è ancora "in corso" o è morta? –

+0

@AndyHayden si è bloccato per ora. Non fa parte dell'attuale versione di Git. – VonC

+0

Grazie! Hmmm, aveva voluto disabilitare tutti i comandi di fusione, suppongo di dover usare un wrapper per git: s. –

Problemi correlati