Siamo geek Subversion e vogliamo conoscere i vantaggi di Mercurial [chiuso]


22

Avendo letto che sono un fanatico di Subversion, perché dovrei considerare o meno Mercurial o Git o qualsiasi altro DVCS .

Ho una domanda di follow-up correlata. Ho letto quella domanda e letto i link e i video consigliati e ne vedo i vantaggi, ma non vedo lo spostamento mentale generale di cui parlano le persone.

Il nostro team è composto da 8-10 sviluppatori che lavorano su un'unica grande base di codice composta da 60 progetti. Usiamo Subversion e abbiamo un trunk principale. Quando uno sviluppatore avvia un nuovo caso Fogbugz creano un ramo svn, fanno il lavoro sul ramo e quando hanno finito si fondono di nuovo con il tronco. Occasionalmente possono rimanere sul ramo per un tempo prolungato e unire il tronco al ramo per raccogliere le modifiche.

Quando ho visto Linus parlare delle persone che creano un ramo e non lo fanno mai più, non siamo affatto noi. Creiamo probabilmente 50-100 filiali alla settimana senza problemi. La più grande sfida è la fusione, ma siamo diventati abbastanza bravi anche in questo. Tendo a fondermi con il caso fogbugz e il check-in piuttosto che l'intera radice del ramo.

Non lavoriamo mai in remoto e non facciamo mai rami fuori dai rami. Se sei l'unico che lavora in quella sezione della base di codice, l'unione al trunk procede senza intoppi. Se qualcun altro ha modificato la stessa sezione di codice, l'unione può diventare disordinata e potrebbe essere necessario eseguire un intervento chirurgico. I conflitti sono conflitti, non vedo come qualsiasi sistema potrebbe farlo bene il più delle volte a meno che se non fosse abbastanza intelligente da capire il codice.

Dopo aver creato un ramo, il seguente checkout di 60k + file richiede del tempo, ma ciò costituirebbe un problema con qualsiasi sistema di controllo del codice sorgente che utilizzeremmo.

C'è qualche vantaggio di qualche DVCS che non stiamo vedendo che ci sarebbe di grande aiuto?


Sembra quasi che tu stia già utilizzando SVN come DVCS (rispetto alla ramificazione, comunque). Sono sicuro che puoi fare quasi tutto ciò che Mercurial può fare con SVN (e viceversa); allora la domanda è: quale è più facile da usare e più conveniente per il tuo particolare scenario di sviluppo? Penso che dovrai provare Mercurial per vedere se ne vale la pena o meno
Cameron,

Sono un fan di Mercurial e offre chiaramente un superset delle funzionalità di SVN, ma ciò detto, queste funzionalità extra sono davvero utili solo per una piccola minoranza di progetti. Probabilmente non ne avrai bisogno, non cambierà la tua vita, ma avresti più funzionalità e non perderai nulla, quindi perché no?
jiggy,

Hai verificato Hg Init ? È un tutorial di Mercurial scritto da Joel Spolsky. Inizia con un capitolo per gli utenti di Subversion, ma per il resto si aspetta che tu non sappia nulla del DVCS.
Barry Brown,

Risposte:


11

Per riformulare la tua domanda, "Se prevediamo di utilizzare il DVCS solo in modo centralizzato, quali vantaggi ha?" Quando lo chiedi in questo modo, non lo fa. Un ramo per attività è estremamente comune in VCS. Se ci pensate, avere una copia di lavoro locale del codice sorgente sul computer di uno sviluppatore che cambia in modo indipendente dal trunk per un giorno è un ramo, anche se nessuno lo chiama così. L'unica differenza tra questo e il tuo flusso di lavoro è che stai assegnando a quei rami un nome permanente anche sul server centrale. Non è il tipo di ramificazione di cui stanno parlando Linus e altri.

Comprendere il DVCS richiede un cambiamento fondamentale nel pensiero. Devi chiederti cosa faresti con tutti i rami che vuoi che siano condivisi con chi vuoi e solo con loro. Ciò include i rami che sono visti solo da te.

Le possibilità sono infinite. Per un solo esempio, che ne dici di due persone che lavorano su lati opposti di un'interfaccia? Devono condividere il codice tra loro regolarmente, ma non è ancora abbastanza stabile da condividere con tutti. Possono creare un ramo da condividere tra loro, quindi rimetterlo nel repository centrale quando è pronto.

La capacità di eseguire commit locali intermedi vale da sola. È qualcosa che devi solo provare da solo.

Anche la velocità guadagnata con il repository locale vale da sola. Sì, il clone iniziale sarà inevitabilmente lento in qualsiasi VCS per un repository di file da 60k, ma una volta ottenuto ciò, il check-out di un nuovo ramo è più rapido di ordini di grandezza con un DVCS.


2
+1! Inoltre, se dai a mercurial un tentativo equo e approfondito, sono certo che non vorrai tornare indietro.
Pete,

1
"Devi chiederti cosa faresti con tutti i rami che vuoi che siano condivisi con chi vuoi e solo loro" ... "due persone che lavorano ai lati opposti di un'interfaccia? Devono condividere il codice con ciascuno altri regolarmente, ma non è ancora abbastanza stabile da condividere con tutti. Possono creare un ramo da condividere tra loro, quindi ricollegarlo nel repository centrale quando è pronto. " Ora abbiamo tutto questo con sovversione.
Matt,

@Matt, allora sei fortunato perché la tua attività è più un'eccezione che una regola. La maggior parte delle aziende ha regole molto rigide sulla creazione di filiali sulla risorsa limitata del server centrale, quindi le persone non pensano nemmeno di crearle per motivi temporanei.
Karl Bielefeldt,

3
Penso che a questa risposta manchi il fatto che il poster originale sta già costringendo SVN a funzionare in un modo che è molto più vicino a un flusso di lavoro DVCS di quanto la maggior parte degli utenti di SVN considererebbe fattibile. In sostanza hanno già la mentalità DVCS, quindi non è necessario alcun cambiamento fondamentale nel pensiero .
Mark Booth,

Buon punto @Mark. In una squadra così piccola, molte convenzioni normali per squadre più grandi escono dalla finestra. Penso ancora che ne valga la pena per motivi di velocità.
Karl Bielefeldt,

1

Per il tuo caso particolare, non vi è alcun vantaggio nel passaggio a un DVCS. Sei soddisfatto del tuo sistema esistente, fa tutto il necessario, quindi perché cambiare? SVN è ancora un progetto Open Source attivo e ha integrazioni migliori e più mature con tutti i principali IDE e strumenti di sviluppo rispetto a hg o git. Date le dimensioni del tuo team e il numero di progetti, vuoi davvero prenderti il ​​tempo per convertirti in un nuovo strumento quando quello esistente funziona bene?

Se hai sviluppatori che non possono funzionare senza un DVCS, indirizzali verso i gateway svn per hg o git. Rendi molto chiaro a loro che i loro check-in nel repository svn devono conformarsi a qualsiasi procedura e processo vengano utilizzati dal resto del team. Un altro vantaggio di questo approccio è che i veri fanatici DVCS che stanno già utilizzando i gateway senza dirti che ora possono uscire dall'armadio :-).


Vogliamo prenderci il tempo di cambiare? No, soprattutto non quando siamo passati a svn negli ultimi 2 anni. Grazie per i tuoi commenti
Matt,

1

Mi sembra che tu stia già utilizzando un flusso di lavoro che è molto simile al tipo di flusso di lavoro che molte persone adottano dopo aver iniziato a utilizzare un DVCS.

Dal tuo punto di vista, un DVCS avrà i seguenti vantaggi significativi rispetto a SVN:

  • Dopo aver clonato i tuoi repository, molte operazioni possono essere eseguite localmente.
    • Guardando il registro del repository non è necessario toccare il server svn, quindi può essere incredibilmente veloce.
    • Allo stesso modo, il passaggio da una filiale all'altra non richiede l'accesso al server, né i cloni locali.
  • Poiché i rami sono solo percorsi divergenti nella storia, il tuo repository non è ingombra di tutti i rami che qualcuno ha creato (in realtà abbiamo solo rami di rilascio in SVN, ma la branchesdirectory ha ancora molte sottodirectory che non sono più rilevanti).
    • In git, una volta che un ramo è stato unito nuovamente e il ref eliminato, potresti non sapere mai che era anche lì.
    • In Mercurial hai la possibilità di nominare un ramo (nel qual caso è codificato in ogni changeset in perpetuità) o semplicemente creare un ramo senza nome (topologico), che si fonderà silenziosamente nella storia quando mergetornerà in default( trunk)
  • In SVN, i rami dei rami sono troppo oscuri per essere utili. In gite hgsono solo par per il corso.
  • I DVCS comprendono che lo sviluppo del software è un DAG , ovvero quando si uniscono, si finisce con un changeset con più genitori. SVN (almeno la versione che ho usato) non lo capisce davvero.

Su quest'ultimo punto, dici

I conflitti sono conflitti, non vedo come qualsiasi sistema potrebbe farlo bene il più delle volte a meno che non sia abbastanza intelligente da capire il codice.

Nel passare dall'usare hgesclusivamente all'utilizzo svnda solo e poi gitsvnè stata la mia esperienza che le fusioni sono molto più semplici e senza problemi con hge gitsvnrispetto a come sono svn. Le fusioni con svn(almeno la versione che utilizziamo) producono molti più conflitti che devono essere risolti manualmente.

Uno dei motivi per cui le fusioni sono più difficili in SVN è che ti dà solo due opzioni per ogni linea che differisce,

  • il testo del ramo in cui ti stai unendo
  • il testo del ramo in cui ti stai unendo

mentre le fusioni da un DVCS offrono in genere una terza opzione, ovvero

  • il testo dell'antenato comune di entrambi i rami che stai unendo

Non sottovalutare quanto sia benefico questo, ti fornisce un contesto molto migliore per i cambiamenti rispetto a un semplice diff bidirezionale.

Tutto sommato, suggerirei di provarlo. Con strumenti come gitsvne hgsubversion, puoi persino provarli con i tuoi attuali repository SVN .

Nota, in primo luogo la creazione del clone è un PItA reale, ma una volta che lo hai fatto, ottieni la maggior parte della potenza di un DVCS con il tuo CVCS esistente.


1
SVN non fa scoppiare un conflitto nel caso in cui menzioni neanche tu. Si apre solo quando cambiate entrambe le stesse linee. L'unione è generalmente un problema in più con i file rinomina / sposta o aggiungi / elimina in svn perché non gestisce bene l'unione delle modifiche alla directory. L'unione di SVN ti offre più opzioni di quelle 2, in genere uso "usa le loro e poi le mie" poiché generalmente vuoi mantenere entrambe le serie di modifiche, non cancellarle entrambe!
gbjbaanb,

@gbjbaanb - Non è quello che ho trovato, motivo per cui ho qualificato la mia esperienza con SVN at least the version I've used. La mia comprensione è che l'ultima versione di svn non capire circa antenati comuni, ma non ho alcuna esperienza di questo e ho il sospetto che ci sono molti server là fuori che eseguono versioni precedenti di svn che hanno gli stessi problemi.
Mark Booth,

Per inciso, adoro il fatto che con hg(e quasi certamente git, ma non l'ho provato) puoi prendere un file con tre classi, dividerlo in tre file con una classe ciascuno, quindi unire le modifiche tra un ramo con il file 'combinato' e un ramo con file separati in modo tale che le modifiche alle singole classi vengano applicate ai file corretti. Pura magia. * 8 ')
Mark Booth,

1
gbjbaanb è corretto; SVN non avrebbe un conflitto nello scenario che descrivi. È abbastanza facile dimostrarlo a te stesso.
Jeremy,

@Jeremy @gbjaanb - La sezione modificata funziona meglio per te? Non ho intenzione di discutere con te su come svndovrebbero funzionare le fusioni, ho la mia esperienza con la svnriga di comando e SVNKit in Eclipse in cui il semplice inserimento di aggiornamenti può provocare "conflitti" che devono essere risolti manualmente con taglia e incolla (Non posso facilmente dire 'Voglio entrambi questi cambiamenti, in questo ordine).
Mark Booth,

0

C'è un cambiamento importante che ho notato dopo una tale transizione: cambio rami molto più spesso e mi impegno più spesso di quanto potrei mai permettermi con Subversion. Ad esempio, ci sono una serie di minuscoli rami di funzionalità, organizzati in una sequenza, e posso trascorrere mesi aggiungendo bit a ciascuno di essi, riordinandoli facilmente tutti in sequenza in un trunk in continua evoluzione. Riorganizzare l'ordine in cui i rami funzionalità vengono uniti è banale.

Ma, in realtà, in realtà non mi sono allontanato da Subversion. Sto solo usando git come il mio client svn locale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.