Um pouco sobre Subversion

O que é Subversion?

Subversion é um sistema de controle de versão livre/open-source. Isto é, o Subversion gerencia arquivos e diretórios, e as modificações feitas neles ao longo do tempo. Isto permite que você recupere versões antigas de seus dados, ou que examine o histórico de suas alterações.

História do Subversion

No começo do ano 2000, a CollabNet, Inc. (http://www.collab.net) começou a procurar profissionais para desenvolver um substituto para o CVS. O CVS havia se firmado como um padrão de fato no mundo open source principalmente porque não havia nada melhor, pelo menos sob licença livre. Então a CollabNet decidiu desenvolver um novo sistema de controle de versão a partir do zero, mantendo as idéias básicas do CVS, mas sem os bugs e seus inconvenientes.

A CollabNet contratou Karl e Ben Collins-Sussman, e um projeto detalhado de trabalho começou em Maio. Com a ajuda e incentivo de Brian Behlendorf, Jason Robbins e Greg Stein. A equipe não queria romper com a metodologia existente para controle de versão, eles apenas queriam corrigir o CVS. Eles decidiram que o Subversion deveria ser compatível com as características do CVS, e manter o mesmo modelo de desenvolvimento, mas não reproduzir as falhas mais óbvias do CVS. E mesmo que o novo sistema não fosse um substituto definitivo para o CVS, ele deveria ser suficientemente semelhante a este para que qualquer usuário do CVS pudesse migrar de sistema com pouco esforço.

Depois de quatorze meses de desenvolvimento, o Subversion tornou-se “auto-gerenciável” em 31 de Agosto de 2001. Ou seja, os desenvolvedores do Subversion pararam de usar o CVS para gerir seu próprio código-fonte, e começaram a usar o próprio Subversion no lugar.

Características do Subversion

O Subversion proporciona:

Versionamento de diretórios

O CVS apenas rastreia o histórico de arquivos individuais, já o Subversion implementa um sistema de arquivos “virtual” sob controle de versão que rastreia modificações a toda a árvore de diretório ao longo do tempo. Os arquivos e os diretórios são versionados.

Histórico de versões efetivo

Como o CVS é limitado apenas ao versionamento de arquivos, operações como cópia e renomeação (que podem ocorrer com arquivos também, mas que são realmente alterações no conteúdo de algum diretório continente) não são suportadas no CVS. Adicionalmente, no CVS você não pode substituir um arquivo versionado por alguma outra coisa com o mesmo nome sem que o novo item deixe de herdar o histórico do arquivo antigo (que talvez seja até algo com o qual não mantenha nenhuma correlação). Com o Subversion, você pode adicionar, excluir, copiar, e renomear ambos os arquivos ou diretórios e cada novo arquivo adicionado começa com um histórico próprio e completamente novo.

Commits atômicos

Um conjunto de modificações ou é inteiramente registrado no repositório, ou não é registrado de forma nenhuma. Isto possibilita aos desenvolvedores criarem e registrarem alterações como blocos lógicos, e também evita problemas que possam ocorrer quando apenas uma parte de um conjunto de alterações seja enviada com sucesso ao repositório.

Versionamento de metadados

Cada arquivo e diretório tem um conjunto de propriedades(chaves e seus valores) associados consigo. Você pode criar e armazenar quaisquer pares chave/valor que quiser. As propriedades são versionadas ao longo do tempo, tal como os conteúdos de arquivo.

Escolha das camadas de rede

O Subversion tem uma noção abstrata do acesso ao repositório, tornando-o mais fácil para as pessoas implementarem novos mecanismos de rede. O Subversion pode se associar ao servidor Apache HTTP como um módulo de extensão. Isto dá ao Subversion uma grande vantagem em estabilidade e interoperabilidade, além de acesso instantâneo aos recursos existentes oferecidos por este servidor-autenticação, autorização, compactação online, dentre outros. Um servidor Subversion mais leve e independente também está disponível. Este servidor utiliza um protocolo específico o qual pode ser facilmente ser tunelado sobre SSH.

Manipulação consistente de dados

O Subversion exprime as diferenças de arquivo usando um algoritmo diferenciado, o qual funciona de maneira idêntica tanto em arquivos texto (compreensível para humanos) quanto em arquivos binários (incompreensível para humanos). Ambos os tipos de arquivos são igualmente armazenados de forma compactada no repositório, e as diferenças são enviadas em ambas as direções pela rede.

Ramificações e rotulagem eficiente

O custo de se fazer ramificações (branching) e de rotulagem (tagging) não precisa ser proporcional ao tamanho do projeto. O Subversion cria ramos e rótulos simplesmente copiando o projeto, usando um mecanismo semelhante a um hard-link. Assim essas operações levam apenas uma pequena e constante quantidade de tempo.

Hackability

O Subversion não tem qualquer bagagem histórica; ele é implementado como um conjunto de bibliotecas C compartilhadas com APIs bem definidas. Isto torna o Subversion extremamente manutenível e usável por outras aplicações e linguagens.


O Repositório

O Subversion é um sistema centralizado de compartilhamento de informação. Em seu núcleo está um repositório, que é uma central de armazenamento de dados. O repositório armazena informação em forma de uma árvore de arquivosuma hierarquia típica de arquivos e diretórios. Qualquer número de clientes se conecta ao repositório, e então lê ou escreve nestes arquivos. Ao gravar dados, um cliente torna a informação disponível para outros; ao ler os dados, o cliente recebe informação de outros.
Figura abaixo: “Um típico sistema cliente/servidor” ilustra isso.


O Problema do Compartilhamento de Arquivos


Todos os sistemas de controle de versão têm de resolver o mesmo problema fundamental: como o sistema permitirá que os usuários compartilhem informação, e como ele prevenirá conflitos, pois é muito fácil para os usuários acidentalmente sobrescrever as mudanças feitas pelos outros no repositório.

A Solução Lock-Modify-Unlock

Muitos sistemas de controle de versão usam o modelo lock-modify-unlock (travar-modificar-destravar) para resolver o problema de vários autores destruírem o trabalho uns dos outros. Neste modelo, o repositório permite que apenas uma pessoa de cada vez altere o arquivo, essa política de exclusividade é gerenciada usando locks (travas).
A figura abaixo: “modelo lock-modify-unlock”.



Apesar de usual esse modelo tem problemas como:

Locks podem causar problemas administrativos: se um usuário “travar” o arquivo resulta em perda de tempo para os outros usuários.
Locking pode causar serialização desnecessária: um mesmo arquivo modificado em partes distintas por dois usuários diferentes não pode ser feito.
Locking pode criar falsa sensação de segurança: se um arquivo A for modificado por um usuário e um arquivo B for modificado por um outro usuário, mas A e B possuíam dependências mutuas gerara erro se algo foi modificado.


Solução Copy-Modify-Merge


O Subversion usa o modelo de copy-modify-merge (copiar-modificar-fundir) como uma alternativa ao locking. Nesse modelo, cada usuário se conecta ao repositório do projeto e cria uma cópia de trabalho pessoal (personal working copy, ou cópia local) - um espelho local dos arquivos e diretórios do repositório. Os usuários então trabalham simultaneamente e independentemente, modificando suas cópias privadas. Finalmente, as cópias privadas são fundidas (merged) numa nova versão final. O sistema de controle de versão frequentemente ajuda com a fusão, mas, no final, a intervenção humana é a única capaz de garantir que as mudanças foram realizadas de forma correta.
Figura abaixo exemplo demonstrativo de seu funcionamento:









Quando um usuário sobrescreve alterações feitas por outro ocorre uma situação de conflito e no momento da fusão entre as alterações efetuadas pelos usuários haverá uma sinalização, os usuários envolvidos decidirão qual versão será consolidada. O modelo copy-modify-merge pode soar um pouco caótico, mas, na prática, ele funciona de forma bastante suave. Os usuários podem trabalhar em paralelo, nunca esperando uns pelos outros. Quando eles trabalham nos mesmos arquivos, verifica-se que a maioria de suas alterações simultâneas não se sobrepõe afinal; conflitos não são muito frequentes. E a quantidade de tempo que eles levam para resolver os conflitos é geralmente muito menor que o tempo perdido no sistema de locking.

Pode-se imaginar que o modelo o modelo copy substituiria o lock, mas o modelo lock é necessário em situações onde a modificação pode acarretar erro ou a perca da informação como arquivos binários ou elementos visuais como fotos ou vídeos, a substituição parcial pode acarretar na perda parcial ou total do arquivo.

Comentários

Postagens mais visitadas