Cercherò di elaborare una strategia per il controllo delle versioni per la mia azienda; attualmente utilizziamo SVN ma non esiste una struttura: fondamentalmente abbiamo solo un trunk e ci impegniamo solo per quello. Recentemente il responsabile dello sviluppo ha avviato un secondo repository che funge da "tag", ma deve essere unito manualmente al "trunk" poiché non fa parte dello stesso repository ma è totalmente separato. In effetti c'è solo una cartella, chiamata "Dev" (in realtà ci sono diverse cartelle "Dev" in date diverse ma solo "Dev" è la principale) e sotto c'è tutto il resto; tutti gli altri progetti. Non è organizzato per progetto, non ha il concetto di rami / tag / trunk o altro. La persona che lo ha impostato inizialmente (da tempo, ovviamente) sembrava non sapere affatto come impostare SVN, e da allora nessuno si è preso la briga di imparare a fare le cose correttamente per paura di rompere qualcosa. Non utilizziamo alcun tipo di CI (o test automatici, purtroppo).
Innanzitutto, dovremmo averlo separato per progetto? Ad esempio, abbiamo: due siti Web ASP.NET (non applicazioni Web, siti Web), un servizio Web, una cartella di distribuzione per tutti gli script di tabella e le procedure memorizzate, due client della riga di comando per progetti esterni che vengono chiamati dal Siti Web e una cartella condivisa con oggetti business comuni e simili. Ognuno di questi dovrebbe essere il proprio progetto con un'impostazione branch / tag / trunk, o dovrebbe essere così:
dev/
branches/
tags/
trunk/
Site1/
Site2/
WebService/
SharedCode/
e tutti i rami e tutto hanno una copia dell'intera cartella Dev? Questo approccio potrebbe essere più facile da ingoiare poiché spesso abbiamo situazioni in cui è necessario apportare modifiche alla libreria di codice condivisa e almeno uno (di solito entrambi) dei siti Web.
In secondo luogo, eseguiamo rilasci regolari ("push" nel nostro linguaggio) sul nostro server di sviluppo e server live. Da quello che ho letto il modo migliore per gestire questo sarebbe che tutto lo sviluppo va in trunk /, i rami sono "temporanei" e utilizzati per aggiungere una nuova funzionalità che potrebbe influenzare trunk e i tag sono per le versioni? Quindi, spingiamo ogni mese, diciamo, e sto lavorando a un modulo nuovo di zecca. Vorrei diramare trunk e utilizzare quel ramo per il mio codice, scrivendolo e testandolo e quant'altro. Al termine del modulo, lo ricollegherei nel trunk (e forse eliminerei il ramo) e quando siamo pronti per la distribuzione, lo taggeremmo (diciamo "Maggio2011"). Se abbiamo una correzione di bug dopo che diventa attiva, sarebbe stata riparata nel tag May2011 e unita in trunk (quindi anche trunk ottiene la correzione), e poi May2011 verrebbe espulso di nuovo con la correzione? È questa l'intenzione di taggare?