Sto utilizzando il ramo default
per lo sviluppo in corso e ora creerò un nuovo ramo con nome per contrassegnare un rilascio. Tutti ulteriore sviluppo sarà sul ramo di default, tutte le correzioni di produzione sarà fatto sul nuovo (con conseguente fusione per default
), in questo modo:Mercurial: consenti l'unione da un ramo di rilascio a quello predefinito, ma non viceversa
#>hg branches
aristotle 42:dbd...
default 41:da5...
#>hg branch
default
#>echo "Feature #1 for the next release" >> feature1.txt
#>hg add
#>hg commit -m "Implement feature #1 for the next release"
...... eek, need to make an urgent fix on Production .....
#>hg update aristotle
#>echo "Fixed urgent bug #123 on Production" >> fix123.txt
#>hg add
#>hg commit -m "Fixed bug #123 on Production"
created new head
#>hg update default
#>hg merge aristotle
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, dont forget to commit)
#>hg commit -m "Merge in the fix for bug #123"
#>hg push
Il sembra la strada da percorrere sopra, Tuttavia sembra facile da rovinare e unire l'altro modo intorno a (da default
a aristotle
che significa che tutte le nuove funzionalità appariranno nel ramo di produzione).
Forse le mie paure sono infondate perché si noterà il disordine prima di spingere il commit al repository centrale, ma mi piacerebbe vedere se è possibile rendere l'approccio più infallibile.
Così ho iniziato a guardare in ganci:
[hooks]
pretxnchangegroup.branch = hg heads --template "{branches} " | find "aristotle" && exit 1 || exit 0
..ma poi si rese conto che non è quello che mi serve, perché questo non mi permette di spingere le modifiche Aristotele a tutti.
Quindi non sono sicuro di cosa fare. Idealmente, voglio che gli sviluppatori vedano il messaggio "unione errata" quando tentano di eseguire un'unione da default
a aristotle
localmente (ovviamente, ci dovrebbe essere un doppio controllo sul repository centrale), mentre si uniscono dal ramo di produzione a quello di default dovrebbe essere possibile.
Grazie!
Forse si può fare qualcosa dove se il commit è sul ramo di produzione, e quel commit ha più di un genitore (un merge commit), e uno di quei genitori è sul ramo predefinito, fallire. Potresti voler cercare l'estensione contiene per aiutarti con questo: http://mercurial.selenic.com/wiki/ContainsExtension Non abbiamo alcuna protezione reale contro questo, ma abbiamo un hook post-commit che stampa ciò che è realmente accaduto durante il commit (stai unendo branch1 a branch2), che lo sviluppatore può leggere per verificare di aver fatto la cosa giusta. –
Mark, molte grazie per il commento ma "hg update default" seguito da "hg merge aristotle" sembra esattamente come il messaggio "merging branch1 into branch2" (e ahimè, un messaggio non impedisce il push/commit sbagliato). Inoltre non sono sicuro di come "contiene l'estensione" possa aiutare nel mio caso :(Forse puoi approfondire come hai implementato esattamente il tuo hook post-commit? – andreister
Il mio hook post-commit non impedisce effettivamente che accada qualcosa, ma fornisce informazioni alla persona che esegue il commit che spiega l'azione che sta accadendo. È come quando leggi un numero di telefono a qualcuno e poi chiedi loro di leggerlo di nuovo per assicurarti che ti capiscano. e poi Mercurial ti spiega l'azione in modo da avere la possibilità di cogliere un errore –