Subversion(SVN)
Introdução
[editar | editar código-fonte]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. Devido a isso, muitas pessoas tratam um sistema de controle de versão como uma espécie de “máquina do tempo”.
Características do Subversion
[editar | editar código-fonte]O Subversion proporciona:
- Versionamento de diretórios
- Histórico de versões efetivo
- Commits atômicos
- Versionamento de metadados
- Escolha das camadas de rede
- Manipulação consistente de dados
- Ramificações e rotulagem eficiente
- Hackabilidade
Arquitetura do Subversion
[editar | editar código-fonte]Em uma ponta encontra-se um repositório do Subversion que mantém todos os seus dados versionados. No outro extremo está o seu programa cliente Subversion, que gerencia cópias locais de partes desses dados versionados (chamadas de “cópias de trabalho”). Entre esses dois extremos estão múltiplas rotas por entre várias camadas de Acesso ao Repositório (RA). Algumas dessas rotas partem das redes de computadores até os servidores de rede, de onde então acessam o repositório. Outras desconsideram a rede completamente e acessam diretamente o repositório.
Componentes do Subversion
[editar | editar código-fonte]Uma vez instalado, o Subversion consiste num conjunto de diversas partes. Uma breve visão geral sobre tudo o que você dispõe é mostrada a seguir. Não se preocupe se as breves descrições acabarem fundindo a sua cuca—há muito mais páginas neste livro para acabar com essa confusão.
svn
O programa cliente de linha de comando.
svnversion
Um programa para informar o estado (em termos das revisões dos itens presentes) da cópia de trabalho.
svnlook
Uma ferramenta para inspecionar um repositório Subversion diretamente.
svnadmin
Uma ferramenta para criação, ajuste e manutenção de um repositório Subversion.
svndumpfilter
Um programa para filtragem de fluxos de um repositório Subversion.
mod_dav_svn
Um módulo plugin para o servidor Apache HTTP, usado para disponibilizar seu repositório a outros através da rede.
svnserve
Um específico programa servidor independente, executável como um processo daemon ou invocável via SSH; uma outra forma de disponibilizar seu repositório a outros através da rede.
svnsync
Um programa para fazer espelhamento incremental de um repositório para outro através da rede.
Controle de Versão com Subversion
[editar | editar código-fonte]Revisões
[editar | editar código-fonte]Um repositório SVN pode ser visto como uma lista de revisões. Uma revisão é o estado em que o repositório estava após determinado commit. Cada revisão recebe um número exclusivo que é maior que o número da revisão anterior em uma unidade.
Cópias de Trabalho
[editar | editar código-fonte]Uma cópia de trabalho é um diretório local que contem uma cópia dos arquivos de um repositório SVN. A cópia de trabalho ainda contém um arquivo .svn que ajuda o Subversion a reconhecer aqueles arquivos que possuem mudanças ainda não publicadas.
Para criar uma cópia de trabalho a partir de um repositório, é usado o comando svn checkout. Se alguma alteração for feita nos arquivos da cópia de trabalho, é necessário publicar essas mudanças usando o comando svn commit.
Se houver mais de um usuário trabalhando no projeto, é comum que as cópias de trabalho de cada um fique desatualizada em relação ao repositório. Para atualizar a cópia de trabalho, é usado o comando svn update. Isso fará com que as mudanças, feitas pelos outros colaboradores, já publicadas, sejam incorporadas na cópia de trabalho local.
É importante notar que nem sempre as cópias de trabalho correspondem a uma única revisão do repositório. Elas podem conter arquivos de várias revisões diferentes. Vamos supor que é feito um checkout de um repositório cuja revisão mais recente seja 4:
dir/ file1.c :4
file2.c :4
Neste momento, esta cópia de trabalho corresponde exatamente à revisão de número 4 no repositório. Mas vamos supor que você faça uma alteração no arquivo file2.c e publique essa alteração. Assumindo que nenhum outro commit tenha sido feito, o seu commit irá criar a revisão 5 no repositório.
dir/ file1.c :4
file2.c :5
Agora, suponha que alguém publique outra alteração no arquivo file1.c, criando a revisão 6. Se você usar o comando svn update, sua cópia de trabalho irá parecer com isto:
dir/ file1.c :6
file2.c :6
Mistura de Revisões
[editar | editar código-fonte]Cada vez que um commit é realizado, a cópia local acabará tendo uma mistura de revisões, ou seja, os arquivos que acabaram de ser publicados são marcados com um número de revisão maior que o resto. Para analisar essa mistura de revisões existe o comando 'svn status'.
Se o seu projeto for muito complexo, você irá descobrir que algumas vezes é interessante forçar um backdate de partes de sua cópia local para revisões anteriores, para testar uma versão anterior ou descobrir quando um bug apareceu pela primeira vez em um arquivo específico.
Instalando e Criando um Repositório SVN local
[editar | editar código-fonte]Os seguintes passos deverão ser tomados para se criar um repositório SVN local, com o intuito de ser usado por um único usuário, como uma maneira de aprender os comandos básicos SVN.
Debian/Ubuntu
[editar | editar código-fonte]Passo 1 - Instalando o SVN
$ sudo apt-get update
$ sudo apt-get install subversion
Passo 2 - Criando o Repositório
$ mkdir /home/user/svnrep
$ svnadmin create /home/user/svnrep/projeto1
Passo 3 - Criando as pastas básicas de um repositório SVN
$ cd <caminho para a pasta de trabalho>
$ mkdir branches trunk tags
# Após isso mova os arquivos do seu projeto pra pasta trunk
Passo 4 - Importando um projeto
# O método de acesso 'file://' serve para indicar que é um repositório local
$ svn import <caminho para o seu projeto> file:///home/user/svnrep/projeto1/trunk -m "Importacao Inicial"
Passo 5 - Fazendo o Checkout para uma cópia de trabalho
# Você poderia especificar qual pasta gostaria de fazer o checkou do repositório
# nesse caso escolhemos o projeto inteiro, poderia ser só a Trunk
$ svn checkout file:///home/user/svnrep/projeto1/ <caminho para a pasta de trabalho>
Passo 6 - Commitando as mudanças
No SVN você deve especificar as operações feitas nos arquivos e pastas pelos comandos svn add, svn delete, svn copy e svn move. Caso você tenha criado um arquivo novo, é necessário versionar esse arquivo para que o SVN tenha controle dele no commit usando o comando svn add
$ svn add <Meu Arquivo ou pasta não-versionado>
Assim você poderá commitar suas mudanças (Um commit contêm apenas arquivos versionados):
$ svn commit -m "Informações sobre o commit"
Criando uma Branch
[editar | editar código-fonte]Passo 1 - Criando a Branch
$ svn copy trunk branches/minha-branch-1
A branches/minha-branch-1
Passo 2 - Commitando a Branch
$ svn commit -m "Criando um branch do diretorio /projeto1/trunk"
A branches/minha-branch-1
É aconselhável fazer um checkout da branch que você irá trabalhar em uma nova pasta de trabalho, para prevenir problemas futuros no merge
Merge da Branch no Trunk
[editar | editar código-fonte]Passo 1 - Checkout de uma cópia do Trunk
$ svn checkout file:///home/user/svnrep/projeto1/trunk
Passo 2 - Descobrindo o número de revisão da branch
# Aqui você deve escolher qual número da revisão que irá ser
# fundida com o Trunk
$ svn log --stop-on-copy file:///home/user/svnrep/projeto1/branches/minha-branch-1
Passo 3 - Realize o merge
# XXXX será o número da revisão do trunk e YYYY o da branch a serem combinados
$ svn merge -rXXXX:YYYY file:///home/user/svnrep/projeto1/branches/minha-branch-1
Passo 4 - Resolva os conflitos encontrados durante o merge
Passo 5 - Commite as mudanças
$ svn commit -m "Realizado o merge da branch no trunk"
Diretórios
[editar | editar código-fonte]O Subversion possui uma estrutura recomendada de diretórios. Eles são TRUNK, TAGS e BRANCHES.
Trunk
É para onde vão todos os commits diários. Os desenvolvedores enviam suas revisões diretamente para essa pasta.
Branches
Quando a equipe de desenvolvimento decide que a versão está pronta, uma cópia é feita com o nome da versão (Ex.: 1.0, 2.1 etc.) na pasta BRANCHES. Essa versão é testada exaustivamente, e nada novo é criado. Apenas bugs são resolvidos.
Tags
Assim que todos os bugs do BRANCH forem resolvidos, a pasta é copiada para o TAGS. E a versão final é liberada. Nada mais é modificado nessa versão.
Quando criar branches?
[editar | editar código-fonte]Existem alguns sistemas para usar no seu projeto:
- O sistema "sem BRANCHES" - Nesse sistema, só existe a pasta TRUNK e tudo é comitado lá. É mais simples de utilizar mas possui um grande problema: o sistema pode ficar instável a qualquer momento.
- O sistema "BRANCH o tempo todo" - Cada usuário possui seu BRANCH privado, e alguém revisa todos os commits e junta tudo na pasta TRUNK.
- O sistema "BRANCH quando precisar" - Apenas quando uma versão está (teoricamente) pronta, é criado um BRANCH.
É importantíssimo respeitar dois pontos:
1. Todos os commits devem ser pequenos, com apenas uma correção de bug, ou apenas uma nova funcionalidade. Nada de juntar uma série de atividades em um commit.
2. O BRANCH tem que rodar sempre, e sem erros.
Ciclo Básico de Trabalho
[editar | editar código-fonte]O Subversion tem diversos recursos, opções, avisos e sinalizações, mas no básico do dia-a-dia, é mais provável que você utilize apenas uns poucos destes recursos.
Um ciclo comum de trabalho com o Subversion é parecido com:
1) Atualizar sua cópia de trabalho - Envolve o uso do comando svn update
2) Fazer alterações - Modificar arquivos existentes são alterações mais comuns, mas ás vezes é necessário adicionar, remover, copiar ou mover arquivos e diretórios. Os comandos svn add, svn delete, svn copy e svn move cuidam dessas mudanças na cópia de trabalho.
3) Revisar alterações - Os comandos svn status e svn diff ajudam a revisar as mudanças feitas na cópia de trabalho.
4) Corrigir erros - O comando svn revert restaura um arquivo ou diretório para seu estado antes da modificação.
5) Resolver conflitos - A atualização da cópia de trabalho pode gerar conflitos locais que podem ser resolvidos com svn resolve.
6) Publicar mudanças - O comando svn commit envia as mudanças locais para o repositório.