En el pasado, he usado los repositorios de Subversion para almacenar mis documentos de origen, y he seguido la convención de "proyecto menor" para la organización de repositorios, que he encontrado que funciona muy bien para organizaciones grandes y pequeñas.
Estructuraríamos nuestras ramas de repositorio; etiquetas & tronco de la siguiente manera:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
Dentro del propio árbol de origen, usaríamos (algo como) la siguiente estructura:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct-+
| +-build
| +-doc
| +-test
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
La idea era (y sigue siendo) utilizar la estructura del repositorio para ayudar a estructurar la comunicación entre el equipo de ingeniería; la parte del negocio orientada al cliente y otras partes interesadas & expertos de dominio.
Para saberlo: los documentos de origen que se encuentran en uno de los directorios de "proyectos" se utilizan (y ganan dinero) solo una vez. Los documentos que se encuentran en uno de los directorios de "productLines" ganan dinero tantas veces como se vende un producto de esa línea en particular. Los documentos que se encuentran en uno de los directorios de las "bibliotecas" ganan dinero tantas veces como se venden los productos que los usan.
Hace que la noción de amortización de los costos sea explícita y ayuda a desarrollar el soporte para la reutilización de documentos de origen en toda la empresa.
En un mundo ideal, el cliente frente a una parte de la empresa también usaría esta estructura para almacenar presentaciones y aplicaciones; otra garantía de ventas, para que los desarrolladores puedan ver las expectativas de los clientes que se han creado, junto con el directorio del producto correspondiente, y los colegas que se enfrentan al cliente pueden hacer un seguimiento del progreso del desarrollo de las características y productos que están vendiendo.
También significa que existe una estructura común sobre la cual pueden operar nuestras herramientas de automatización de compilación. (Nuestros scripts de compilación recorren el árbol de origen en busca de carpetas de "compilación" en las que encuentran archivos de configuración que especifican cómo se debe construir cada componente; ocurre un proceso similar para la generación y prueba de documentación). Nuevamente, en un mundo ideal, el sitio web de la organización y otros materiales de marketing podrían construirse de la misma manera.
Como una nota final; el sistema de integración continua sabe que necesita desencadenar una compilación; análisis estático; prueba de humo & la prueba de la unidad se ejecuta cada vez que se modifica el troncal, cada vez que se modifica una rama "etiqueta", y cada vez que se modifica una rama "AUTOMATIZADA". De esta manera, los desarrolladores individuales pueden usar el sistema de CI con sus sucursales personales, una capacidad importante, IMHO.