Supponendo che si è limitato ai due sistemi di controllo versione (VCS) lei ha citato, Subversion (SVN) sarà essere più chiaro, più semplice e meglio supportato in quasi tutti gli aspetti, finché non si arriva al punto in cui è necessario supportare più filiali.
Quando è necessario unire codice (ad esempio correzioni di bug) in più versioni, supportare lo sviluppo parallelo di funzionalità di dimensioni significative o un team leggermente più grande di sviluppatori, quindi ClearCase e, più specificamente, la capacità di svilupparsi nei rami e unirli insieme facilmente, valuterà tutto il dolore e le complicazioni extra, specialmente se ClearCase è già stato gestito per te.
Experience
Ho usato ClearCase con tra una persona (me) e più di 400 persone, ha molti fastidi, giorno per giorno, problemi di usabilità e difetti, ma ci permette di ottenere in modo coerente lavoro fatto insieme. In ogni momento l'installazione di ClearCase aveva amministratori dedicati a tempo pieno.
Ho usato Subversion da solo e con un'altra persona, e funziona alla grande giorno per giorno (senza amministratori se non per me) ma molto occasionalmente ma costantemente diventa una significativa fonte di frustrazione dovuta al fatto non può gestire alcun ramo significativo e fondere situazioni.
Perché SVN è scarso nel supportare lo sviluppo e la ramificazione paralleli?
SVN non riesce nel supporto di linee parallele di sviluppo perché ha un supporto automatico molto debole per la fusione delle filiali. Al contrario, tutti gli altri VCS di cui scrivo qui hanno un buon supporto per unire insieme le filiali; per i casi comuni è un'operazione a sforzo zero.
Branching è il modo in cui i sistemi di controllo delle versioni modellano la concorrenza nella vita umana (ad esempio, due sviluppatori lavorano su due diversi problemi in parallelo o uno sviluppatore che ha più problemi aperti contemporaneamente). Ma la ramificazione è inutile se non riesci a combinare facilmente il lavoro di tutti in un insieme coerente!
La ramificazione può avvenire in modo esplicito (nel senso che sono denominati e compresi dal VCS) o implicitamente (come una copia normale dei file o di un pagamento). SVN supporta entrambi, ma nella ramificazione SVN viene generalmente eseguita in modo implicito limitato. Ogni check out è un ramo ma tutti i rami sono forzati per essere sincronizzati su ogni commit/aggiornamento. Ciò accade perché SVN non supporta la fusione semplice di rami espliciti e pertanto i rami espliciti vengono creati raramente.
Dato che sei obbligato a sincronizzarti l'uno con l'altro ad ogni commit, questo diminuisce il potenziale parallelismo all'interno del team. Inoltre, porta a pratiche di sviluppo meno che ideali in quanto non è possibile utilizzare efficacemente il sistema di controllo delle versioni per le proprie esigenze di sviluppo quotidiane. Finisce per essere troppo difficile per provare idee diverse nei propri rami personali e non è possibile effettuare più commit mentre si raffina una funzionalità. Inoltre, è più probabile che ti impegni troppo presto e finisci per interrompere il lavoro di tutti gli altri finché non risolvi il problema nel tuo ultimo commit.
L'altra questione importante è che, dal momento che la fusione rami espliciti non è ben supportato, SVN fa un pessimo lavoro di aiutare si sposta cambiamenti di codice tra le persone e tra i rami. Immagina di provare a correggere un bug sia nel ramo di rilascio che nel ramo di sviluppo; in alternativa, immagina che due sviluppatori stiano lavorando su una funzione correlata e che entrambi debbano scambiarsi reciprocamente, ma solo a punti controllati. Usando SVN puoi svolgere queste attività ma il VCS fa molto poco per aiutarti e devi essere preparato a preparare e mantenere manualmente le patch o spedire i file.
Nell'altra VCS si può chiedere al VCS di unire un ramo contenente una correzione di bug o di una funzione in varie altri rami. Alla fine della giornata tutti questi rami (che a loro volta contengono il contenuto di altri rami) possono quindi essere riuniti nel ramo principale. Molto spesso la maggior parte di questo viene gestita automaticamente e correttamente dal VCS, mentre con SVN questo tipo di flessibilità e parallelismo automatici è quasi inimmaginabile.
grandi squadre ottengono il lavoro fatto senza un forte sostegno per la fusione automatica, ma questo pone un onere maggiore sia sui singoli e sulla squadra organizzazione, comunicazione e di processo.
Il rovescio della medaglia di raggruppamento e fusione semplice è che è necessario essere organizzati e rigorosi sulla fusione delle modifiche insieme a intervalli regolari in quanto non si verifica più automaticamente.
Altre opzioni
Ora, se facciamo un passo indietro e considerare altri sistemi, supponendo che il repository è in gran parte basato su testo e relativamente piccole (meno di qualche centinaio di MB), vorrei suggerire di prendere in seria considerazione utilizzando BZR. BZR è almeno altrettanto facile da usare come SVN, specialmente se conosci già SVN. È anche potente almeno quanto ClearCase sotto tutti gli aspetti importanti dal punto di vista dello sviluppatore; supporta più flussi (rami) di sviluppo e ha un buon supporto per unirli di nuovo insieme. Allo stesso tempo, può supportare uno stile di sviluppo centralizzato, se necessario.
Anche se non ho esperienza con esso Vorrei anche ricordare che è possibile utilizzare lo strumento BZR per accedere a un server SVN con bzr-svn e questo può dare molto dei benefici e unire le capacità di BZR pur avendo il vantaggio di ospitare il tuo codice sulla piattaforma SVN ampiamente capita.
Mentre ho appena suggerito BZR, nel mondo dei sistemi di controllo versione open source distribuito (DVCSs) molte persone sembrano andare con GIT. Non l'ho suggerito, visto che impone una curva di apprendimento molto più acuta agli utenti provenienti da uno sfondo SVN e penso che molti team in natura preferirebbero il miglior supporto di Windows e la facilità d'uso di BZR rispetto alla scalabilità e ai benefici della velocità di GIT .
Se si sceglie di andare con un DVCS come BZR o GIT che probabilmente non c'è bisogno di arrivare troppo appeso su esattamente quali si DVCS iniziare a utilizzare. I sistemi ampiamente utilizzati supportano l'esportazione e l'importazione tra loro e possono almeno importare da SVN.
Perché ritieni che Subversion non sia adatto per gli scenari in cui avrei bisogno di sviluppo e ramificazione paralleli? – Manoj
Manoj: Ho aggiornato la mia risposta per cercare di rispondere alla tua domanda. – Jared
'svn copy' può essere usato per diramarsi esplicitamente e quelli possono essere nominati come desiderato. 'svn merge' può unire i rami di nuovo insieme (non che faccia un ottimo lavoro). Sebbene io sia in gran parte d'accordo con la tua valutazione, SVN non semplifica la fusione e lo sviluppo parallelo, devo prendere in considerazione il fatto che "le diramazioni esplicite non sono ben supportate" e le dichiarazioni correlate come errori reali che riducono il tuo punto principale. Non sono un fan, ma sto lavorando su un ramo SVN in questo momento, e un altro team qui comunemente codifica sui rami personali e si uniscono di nuovo al tronco una volta terminato. –