Ao discutir as características que o Subversion traz para a mesa do controle de versão, é freqüentemente de grande ajuda falar sobre elas em termos de como elas melhoram o projeto do CVS. Se o CVS não é familiar para você, talvez você não compreenda algumas dessas características. E ainda se controle de versão não é familiar para você, talvez você não compreenda nenhuma delas a menos que você primeiramente leia o Capítulo 2, Conceitos Básicos no qual nós damos uma introdução amigável a controle de versão em geral.
O Subversion oferece:
O CVS rastreia o histórico apenas de arquivos individuais, mas o Subversion implementa um sistema de arquivos “virtual” sob controle de versão que rastreia mudanças em árvores inteiras de diretório ao longo do tempo. Arquivos e diretórios têm controle de versão.
Por causa da limitação do CVS de controlar versões apenas de arquivos, operações tais como cópias e renomeações—que podem acontecer em arquivos, mas que são realmente mudanças no conteúdo de algum diretório—não são suportadas no CVS. Além disso, no CVS você não pode substituir um arquivo que está sob controle de versão com alguma coisa nova (talvez sem relação alguma) que tenha o mesmo nome sem que o novo item herde o histórico do arquivo antigo. Com Subversion, você pode adicionar, deletar, copiar e renomear ambos arquivos e diretórios. E cada arquivo novo adicionado inicia um novo histórico limpo e fresquinho.
Um conjunto de modificações ou vai completamente para o repositório ou absolutamente nada vai. Isso permite aos desenvolvedores construir e enviar alterações ao repositório em blocos lógicos e prevenir problemas que podem ocorrer quando apenas uma porção do conjunto de alterações é enviada ao repositório com sucesso.
Cada arquivo e diretório tem um conjunto de propriedades—chaves e seus valores—associadas a ele. Você pode criar e armazenar qualquer par de chave e valor arbitrário que você quiser. Assim como acontece com conteúdo de arquivos, propriedades também têm controle de versão ao longo do tempo.
O Subversion tem uma noção abstraída de acesso a repositório, deixando fácil para as pessoas implementarem novos mecanismos de rede. O Subversion pode plugar no Apache HTTP Server como um módulo de extensão. Isso dá ao Subversion uma grande vantagem em estabilidade e interoperabilidade, e acesso instantâneo a características existentes providas pelo servidor—autenticação, autorização, compressão de dados, entre outras coisas. Também está disponível um servidor standalone mais leve. Esse servidor se comunica usando um protocolo customizado que pode ser facilmente tunelizado sobre SSH.
O Subversion expressa diferenças de arquivo usando um algoritmo binário de diferenciamento, que trabalha igualmente em arquivos texto (humanamente legíveis) e binário (humanamente ilegíveis). Ambos tipos de arquivo são comprimidos e armazenados da mesma forma no repositório, e as diferenças são transmitidas em ambas as direções pela rede.
O custo de branching e tagging não necessitam ser proporcionais ao tamanho do projeto. O Subversion cria branches e tags simplesmente copiando o projeto, usando um mecanismo similar ao hard-link. Logo, essas operações tomam apenas uma pequena e constante quantidade de tempo.
O Subversion não tem bagagem histórica; ele é implementado como uma coleção de bibliotecas C compartilhadas com APIs bem definidas. Isso torna o Subversion extremamente manutenível e utilizável por outras aplicações e linguagens.