2009-07-24 10 views
7

E 'la mia prima volta con un DVCS e anche come sviluppatore solitario, la prima volta che ho effettivamente utilizzato rami, così forse mi manca qualcosa qui.Memorizzazione di rami con nome separati in mercuriale, senza dover unirle

Ho un repository remoto dal quale ho estratto i file e ho iniziato a lavorare. Le modifiche sono state trasferite al repository remoto e, naturalmente, questo semplice scenario funziona correttamente.

Ora che la mia applicazione web ha alcune caratteristiche stabili, mi piacerebbe iniziare la distribuzione e così ho clonato il repository remoto in una directory nuove filiali/stabile al di fuori della mia directory di lavoro per il ramo di default e usato:

hg branch stable 

per creare un nuovo ramo di nome. Ho creato una serie di script di distribuzione che sono necessari solo dal ramo stabile e li ho impegnati, se necessario. Anche questo ha funzionato bene.

Ora, quando sono tornato alla mia directory di lavoro iniziale per lavorare su alcune nuove funzionalità, ho scoperto che Mercurial insiste sul fatto che solo UN capo si trova nel repository remoto. In altre parole, dovrei unire i due rami (predefinito e stabile), aggiungendo gli script di distribuzione non necessari al mio ramo predefinito per inviare al repository principale. Questo potrebbe peggiorare, se dovessi apportare una modifica a un file nella mia filiale stabile per l'implementazione.

Come mantenere separati i rami denominati in Mercurial? Devo creare due repository remoti separati per farlo? In tal caso i rami nominati perdono il loro valore. Mi sto perdendo qualcosa qui?

risposta

3

Dopo aver letto lo section on named branchy development nel libro Mercurial, ho concluso che per me personalmente, la pratica migliore è disporre di repository condivisi separati, uno per ogni ramo. Ero sull'account gratuito su bitbucket.org, quindi stavo cercando di impormi di usare solo un repository condiviso, che ha creato il problema.

ho po 'la pallottola e mi sono preso un account a pagamento in modo che possa mantenere un repository condiviso a parte per le mie versioni stabili.

+2

Cosa l'ha fatto concludere? Non vedo nulla lì dentro che dice "I rami nominati sono cattivi". Personalmente ritengo che siano molto più facili da gestire rispetto a più repository. –

+3

"Nella maggior parte dei casi, isolare i rami nei repository è l'approccio giusto, la sua semplicità lo rende facile da capire e quindi è difficile fare errori. C'è una relazione uno a uno tra i rami in cui lavori e le directory sul tuo sistema. Ciò consente di utilizzare strumenti normali (non a conoscenza del Mercurial) per lavorare su file all'interno di un ramo/repository. " - Dal libro Mercurial Personalmente, per me il suggerimento di cui sopra porta a un modello mentale più semplice. Ho modificato anche la mia risposta. –

+1

Ah, immagino di non essere d'accordo sul fatto che ciò rende le cose più semplici. Cosa succede se il tuo codice deve essere in una posizione specifica sul tuo filesystem? Copi/riduci le cartelle ogni volta che vuoi cambiare ramo? Se qualcuno vuole ottenere tutte le filiali in un progetto, dovrebbe davvero dover clonare l'intera cosa più volte? –

2

Hai scritto:

ho scoperto che Mercurial insiste su una sola testa di essere nel repository remoto.

Perché pensi che sia così?

Dalla aiuto per hg push:

Per impostazione predefinita, spinta si rifiuterà di eseguire se rileva il risultato sarebbe aumentare il numero di teste remote. Questo indica generalmente il che il cliente ha dimenticato di tirare e unire prima di premere.

Se si sa che si sta creando intenzionalmente una nuova testina nel repository remoto, e ciò è desiderabile, utilizzare il flag -f.

+0

È questo il pratica accettata? Sta avendo più teste sul repository remoto ok? –

+0

Ho visto un paio di post sul blog menzionare che è una cattiva pratica avere più teste in un repository condiviso e questo ha senso. –

+0

+1, grazie per avermi indicato nella giusta direzione. –

11

Usa hg push -f per forzare la creazione di una nuova testa a distanza.

La ragione per cui lo push non lo fa per impostazione predefinita è che sta tentando di ricordarti di estrarre e unire in caso te ne sia dimenticato.Quello che non si vuole che accada è:

  • Tu ed io controllare il revisione 100 del nome ramo "X".
  • Si esegue il commit localmente e si spinge.
  • Mi impegno localmente e spingo.

Ora ramo X si presenta così nel repository remoto:

--(100)--(101) 
    \ 
     \---------(102) 

Quale testa dovrebbe afferrare un nuovo sviluppatore se sono check-out del ramo? Chissà.

+0

Penso che lo sviluppatore dovrebbe clonare l'intero repository e aggiornarlo al ramo X. Sarebbe quindi finito alla revisione 102 (la revisione più tip su X). Lo sviluppatore può quindi semplicemente unire le due teste se sa come, o può lasciarlo a qualcun altro. –

1

Sono venuto da git che mi aspettavo la stessa cosa. Basta spingere la cima sembra che potrebbe essere un approccio.

hg push -r punta

Problemi correlati