No passado, eu usei repositórios do Subversion para armazenar meus documentos de origem e segui a convenção "projeto menor" para organização de repositórios, que eu achei que funcionava muito bem para organizações grandes e pequenas.
Estruturaríamos nossas ramificações do repositório; tags e tronco da seguinte forma:
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 da própria árvore de origem, usaríamos (algo como) a seguinte estrutura:
(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
A idéia era (e ainda é) usar a estrutura do repositório para ajudar a estruturar a comunicação entre a equipe de engenharia; a parte do negócio voltada para o cliente e vários outros interessados e especialistas em domínio.
A saber: os documentos de origem que estão em um dos diretórios "projeto" são usados (e ganham dinheiro) apenas uma vez. Os documentos que ficam em um dos diretórios "productLines" ganham dinheiro quantas vezes um produto dessa linha específica é vendido. Os documentos que ficam em um dos diretórios "bibliotecas" ganham dinheiro tantas vezes quanto qualquer produto que os utiliza é vendido.
Isso torna explícita a noção de amortização de custos e ajuda a criar suporte para a reutilização de documentos de origem nos negócios.
Em um mundo ideal, o cliente que enfrenta parte da empresa também usaria essa estrutura para armazenar apresentações e outras garantias de vendas, para que os desenvolvedores possam ver quais expectativas do cliente foram criadas, ao lado do diretório de produtos relevante, e os colegas que acompanham o cliente podem acompanhar o desenvolvimento progresso nos recursos e produtos que eles estão vendendo.
Isso também significa que existe uma estrutura comum sobre a qual nossas ferramentas de automação de construção podem operar. (Nossos scripts de construção percorrem a árvore de origem procurando pastas "construídas" nas quais eles encontram arquivos de configuração que especificam como cada componente deve ser construído; um processo semelhante ocorre para a geração e teste de documentação). Novamente, em um mundo ideal, o site da organização e outras garantias de marketing poderiam ser construídos da mesma maneira.
Como uma nota final; o sistema de integração contínua sabe que precisa acionar uma compilação; análise estática; teste de fumaça e teste de unidade sempre que o tronco é modificado, toda vez que qualquer ramificação "tag" é modificada e cada vez que qualquer ramificação "AUTOMATED" é modificada. Dessa forma, desenvolvedores individuais podem usar o sistema de IC com suas ramificações pessoais, um recurso importante, o IMHO.