2012-05-08 17 views
8

Mercurial - Quali sono i passaggi necessari per eseguire la rinomina di un ramo dopo che è stato creato e impegnato a (sia localmente che nel repository centrale).Rinomina di un ramo con commit in Mercurial

Ad esempio, ho creato un ramo chiamato Zelda e quindi ho eseguito il commit e inviato a un repository centrale. Ora voglio cambiare il nome del ramo in Triforce.

C'è un'estensione che raggiunge questo? Quale potrebbe essere la lunga strada in aggiunta a qualsiasi soluzione di estensione?

+3

Forse la risposta di questo thread si adatta: http://stackoverflow.com/questions/4378684/mercurial-can-i-rename-a-branch – birryree

risposta

10

La risposta breve è no.

La risposta lunga è, i rami Mercurial sono nomi allegati ai changeset. Se si dispone di più changeset assegnati al ramo zelda e dati via (cioè inviati al repository centrale), non è possibile rinominare quel ramo senza ricreare questi changeset, il che significa riscrivere la cronologia.

Anche se si striscia quei gruppi di modifiche sia in voi pronti contro termine e nel repository centrale, poi ricrearli come appartenenti al ramo Triforce, e spingere di nuovo il ramo “rinominato”, tutti i tuoi collaboratori finirà avere due copie dei changeset, una impostata sul ramo zelda, un'altra sul ramo triforce.

Quindi sì, quello che dovresti fare è descritto in https://stackoverflow.com/a/7245187/67988. Per quotare da lì, adattato ai nomi delle filiali, vale a dire zelda è il vecchio ramo da chiudere e triforce è il nuovo ramo da creare.

hg update zelda 
hg commit --close-branch -m "mgmt: Close branch zelda" 
hg branch triforce 
hg commit -m "mgmt: Create branch triforce" 
hg push --new-branch 

P.S. Se nessun altro ha ancora estratto dal repository centrale, puoi provare a rimuovere lo zelda da lì. Oppure, se si ha accesso a tutti i PC di altri sviluppatori (presupponendo un ambiente controllato), e si vuole veramente percorrere una strada molto pericolosa, è possibile rimuovere questo ramo da tutti i repository. Questo non è sicuramente considerato una buona pratica e può essere utilizzato solo come misura di ultima istanza.

+1

Buona risposta. Ma chiuderei 'zelda' prima di aprire' triforce' e quindi mantenere lineare la cronologia. Penso che sembra più pulito. –

+0

@MartinGeisler: Ricordo di aver incontrato alcuni problemi con le filiali chiuse come suggerisci tu. Per quanto ricordo, a Hgweb, i rami che erano chiusi, ma con il changeset di chiusura avente discendenti, erano visualizzati come inattivi, non chiusi. Non lo so, forse questo era un bug che è stato risolto da allora, ma di solito lasciavo il changeset di chiusura da solo, solo per essere al sicuro. – Helgi

+1

Nelle versioni moderne di Mercurial, un ramo * chiuso * viene mostrato con un debole colore in hgweb. Un ramo * inattivo * non ha uno stile diverso, almeno non dallo stile predefinito chiamato "carta". Chiusura prima della fusione significa anche che nella tua storia hai meno teste topologiche. Alcune richieste di protocollo inviano gli hash di tutte le teste topologiche, quindi limitare il numero di teste può aiutare con le prestazioni. Un tempo molte teste potevano far sì che le nostre richieste HTTP superassero la lunghezza massima consentita dai comuni server web, ma ora inviamo i dati nelle intestazioni HTTP. –

Problemi correlati