Tutorial Subversion
Após sofrer um pouco com a utilização do subversion, fiz este tutorial para facilitar minha vida e para ajudar também alguém que possa precisar.
Para este tutorial levamos em consideração que o subversion já está instalado e configurado no servidor. A partir daí seguem alguns comandos básicos (executados no terminal) para efetuar a criação e utilização de repositórios do subversion no linux.
No subversion, não existe a revisão de um determinado arquivo. Os arquivos não tem versões independentes. Todos os arquivos são parte de uma mesma revisão, e a modificação de um único arquivo altera a revisão de todos.
O subversion é um sistema de controle de versões que utiliza o conceito de branches, tags e trunk. Abaixo seguem alguns conceitos para melhor compreensão:
Trunk
A pasta trunk contém os projetos que estão em desenvolvimento. Todas as atualizações efetuadas dia-a-dia são armazenadas na pasta trunk.
Branches
A pasta branches é aquela que contém “linhas de desenvolvimento” de tal projeto, que entre elas podem haver poucas diferenças, porém uma independe da outra.
Quando a equipe decide que o projeto está pronto para ser liberado como uma versão, a pasta trunk é copiada para a pasta branch e dado um nome de versão. Este branch é congelado e não sofre mais alterações, apenas correções. Rigorosos testes são efetuados.
Tags
Quando os testes efetuados encima de um branch estão completos, a versão que se encontra no branch é copiada para a pasta tags, formando assim um “release” ou uma versão “liberada”. Esta pasta tag é empacotada e enviada para o cliente. Qualquer modificação em branch, deve ser copiada para a pasta de tags, após todos os testes.
Svn considera tag apenas uma variação de um branch, e na prática é exatamente como um branch, apenas uma cópia da ramificação atual da árvore.
svnadmin
Uma ferramenta para criar, ajustar ou reparar um repositório Subversion.
Criando um repositório
svnadmin create <nome_do_repositório_a_ser_criado>
ou
svnadmin create <path>/<nome_do_repositorio_a_ser_criado>
*Para alterar alguma coisa no repositório é necessário, após a criação, baixar uma cópia de trabalho, através do comando “checkout”, alterar e usar o comando “commit” para enviar alterações.
svnserve
Um programa servidor independente, que roda como um processo daemon ou pode ser invocado via SSH. É um modo de tornar o repositório disponível na rede.
Tornando o repositório disponível na rede através do protocolo svn
svnserve -d -r <path_repositorio_local>
Desta forma, pode-se acessar o repositório de outras máquinas, através do ip ou hostname.
svn ls svn://<hostname>
svn
O programa cliente para linha de comando.
Comandos para as funcionalidades do controle de versão (checkout, commit, update, etc.)
*Cada comando possui subcomandos para ações específicas.
Importando arquivo ou conteúdo de diretório para o repositório
svn import <path_origem> svn://<servidor_repositorio> -m <frase_descricao>
ou
svn import <path_origem> file:///<path_destino> -m <frase_descricao> *É necessario o uso de um protocolo (svn, file, etc.), pois o svn só trabalha com url’s.
*Ao importar um diretório, para usar o conceito de branch, tag e trunk, é necessário que se importe uma pasta à qual contém o projeto a ser armazenado no repositório contendo as pastas branch e tag (ambas vazias) e trunk (com os arquivos do projeto).
Adicionando arquivos ou diretórios
svn add <path>
*Os arquivos serão adicionados ao repositório no próximo commit.
Removendo arquivos do repositório
svn rm <path_copia_local>
svn commit *Exclui da cópia local e dá um commit para o repositório
ou
svn rm <path_url_repositorio> *Para excluir diretamente do repositório
Listar todos os repositórios disponíveis no servidor srvbuild.
svn ls <url_repositorio>
ou
svn list <url_repositorio>
Há também outra forma de listar o conteúdo do repositório, passando diretamente o caminho onde ele se encontra no disco.
svn ls file:///<path_do_repositorio>
Outros parâmetros podem ser passados, como formas diferentes de listar o conteúdo do repositório.
svn ls –recursive <repositorio> *Desce recursivamente aos conteúdos de cada diretório
svn ls –verbose <repositorio> *Lista informações adicionais
Baixar uma cópia dos arquivos disponíveis no repositório
svn co <url_repositorio>
ou
svn checkout <url_repositorio>
Adicionalmente podem ser passados alguns parâmetros para baixar revisões específicas.
svn co svn://<servidor>/<path> -r <revisao>
ou
svn co file:///<path> -r <revisao> *Neste caso para acessar diretamente o local onde se encontra o repositório
Visualizar informações referentes à uma cópia de trabalho ou item remoto
svn info
ou
svn info <path>
Atualizar uma cópia local com a disponível no repositório
svn update *Se estiver na pasta local de trabalho
ou
svn update <path>
Listar modificações feitas na cópia de trabalho.
svn diff *Se estiver na pasta local de trabalho
ou
svn diff <path_repositorio>
svn diff lista as linhas dos arquivos que sofreram modificações daquelas que estão no repositório.
Listar os arquivos modificados na cópia de trabalho
svn status *Se estiver na pasta local de trabalho
ou
svn status <path_repositorio>
svn status lista os arquivos que sofreram modificações daqueles que estão no repositório.
Enviar as alterações efetuadas na cópia local para o repositório.
svn commit -m <frase> *Se estiver na pasta à qual possui os arquivos locais do repositório
ou
svn commit <path> -m <frase> *A frase é o relato das alterações que estão sendo postadas
Liberar uma “release” para o repositório
Após efetuar todos os testes encima do projeto em desenvolvimento o mesmo deve ser disponibilizado como uma cópia estável para a pasta branches do projeto que está sendo desenvolvido. Para isso, é necessário fazer um checkout da ultima versão do projeto no repositório e simplesmente copiar a pasta trunk para dentro da pasta branches.
Trabalhando com a cópia local:
svn checkout <repositorio>/<nome_projeto> <destino_copia_trabalho>
- cd <destino_copia_trabalho>
svn copy trunk branches/<nome_release_projeto> *Copiando a pasta trunk para a pasta branches
svn status *Para listar os arquivos que sofreram modificações.
svn commit *Somente agora as alterações vão para o repositório
Trabalhando diretamente no repositório
O comando svn copy pode operar sobre diretórios ou diretamente sobre as URL’s do repositório.
svn copy <url_repositorio>/<nome_projeto>/trunk <url_repositorio>/<nome_projeto>/branches -m <frase_descricao>
Visualizar logs de alterações
svn log <path> *Mostra as descrições das alterações feitas nos arquivos ou diretórios
ou
svn log –verbose <path> *Mostra as descrições e os arquivos que sofreram alterações
Propriedades
É possível a atribuição de propriedades à arquivos ou diretórios contidos no repositório.
Listar propriedades de um projeto
svn propget <nome_propriedade> <path_repositorio>
ou
svn status *Se estiver na pasta à qual possui os arquivos locais do repositório
ou
svn status <path_da_pasta_que_possui_os_arquivos_do_repositorio>
Setar propriedades em um projeto
svn propset copyright ‘<mensagem>’ svn://srvbuild/repos/sgiapi-testes
ou
svn propset <nome> -R <local_origem> <local_destino>
ou
svn propset <nome> -F <arquivo_origem> <local_destino>
*As propriedades devem ser setadas em uma cópia local, e realizar commit para efetivação no repositório.
Existem vários tipos de propriedades definidas pelo subversion que podem ser atribuidas aos projetos.
Ligações Externas (svn:externals)
As definições externas são um tipo especial de propriedades, que criam um link à arquivos em outro local no repositório. São um mapeamento de um diretório local para a URL.
Alguns comandos para trabalhar com definições externas:
Setar a propriedade svn:externals para uma cópia local
svn propset svn:externals “<nome_ligacao_externa> <url_repositorio>” <path_local>
svn commit *Para enviar as ligações externas ao repositório
Desta forma, é criado um link à pasta <url_repositorio> dentro do <path_local> fazendo com que, após o commit, sem que se realize um checkout sobre o repositório, automaticamente se baixe os fontes referentes à definição externa. É bastante útil, caso possua uma API, ou libs que sejam necessários para vários projetos. Sendo que quando se realiza manutenção sobre a API ou sobre as libs, a mesma se aplica a todos os projetos que fazem dela uma definição externa.
Listar Ligações externas à um projeto
svn propget svn:externals <url_repositorio>
*Lembrando que os exemplos entre “<…>” deverão ser substituídos pelo caminho do arquivo ou diretório ou url.
Tags: controle, controle de versões, Linux, subversion, svn, versão
You can comment below, or link to this permanent URL from your own site.
Agosto 13, 2007 at 3:01 pm
Parabéns, muito esclarecedor!
Setembro 5, 2007 at 6:10 pm
Thanks for helping me to understand the concepts behind version control in a SVN environment!
Setembro 27, 2007 at 1:23 pm
Muito bom mesmo. Excelente tutorial
Fevereiro 7, 2008 at 7:39 pm
Samuel, seu tutorial é bastante explicativo.
Ajuda muito quem está começando a usar esta ferramenta.
Abs
Cleber
Agosto 15, 2008 at 1:52 pm
Dae Samuca!
Mato a pau no tutorial ;)
Falow!
Agosto 21, 2008 at 12:04 am
[...] Tutorial Subversion « Samuel FeitosaConceitos gerais, tudo explicado [...]
Abril 14, 2009 at 3:56 am
Muito bom!! Parabéns.
Só acho que está ao contrário o conceito de Trunk e Branch, sendo o Trunk o repositório principal, onde só vão pra ele os branchs de uma funcionalidade depois de testada.
O Branch serve para o desenvolvimento de uma funcionalidade. Cada membro da equipe que estiver desenvolvendo uma funcionalidade cria um novo branch para si e quando a funcionalidade estiver pronta e testada ela é integrada ao Trunk.
Abraços.
Maio 5, 2009 at 11:48 pm
bom, muito bom, embora tenha apanhado para configurar no eclipse/ubuntu :)
abs
Junho 15, 2009 at 2:53 pm
Show de boa.
Agora so colocar pra rodar();
Julho 2, 2009 at 12:43 pm
Cara… realmente, muito bom este teu tutorial!
Julho 3, 2009 at 10:01 am
[...] sobre Subversion, encontrei esse tutorial do Samuel Feitosa que apresenta o Subversion sem frescuras. Até serve como um guia de referências [...]
Julho 15, 2009 at 1:43 am
Obrigado amigo sou analista de sistemas e migrei para o linux á pouco em definitivo, e seu tutorial foi muito esclarecedor para min.