Subversion

De Wiki REDDES

Tabla de contenidos

Introdução

Subversion is an open source version control system.

  • Subversion é um sistema centralizado de compartilhamento de informações.
  • Na sua essência é um repositório, um arquivo central de dados.
  • O repositório armazena informações na forma de uma árvore, um sistema típico de hierarquia de arquivos e diretórios.
  • Vários clientes podem se conectar ao repositório, e em seguida, ler ou escrever para esses arquivos.

Algumas Características

  1. Versionamento de diretórios ou pastas
  2. Histórico de versão verdadeiro
  3. Efetivações (commit) atômicos
  4. Metadados versionados
  5. Escolha de camada de rede
  6. Bifurcação (branching) e etiquetagem (tagging) eficientes

O problema de arquivos compartilhados

Todos os sistemas de controle de versão tem um problema em comum: permitir que usuários compartilhe informações. Mas como impedir que acidentalmente um usuário sobrescreva a informação do outro usuário? É demasiadamente fácil que um usuário acidentalmente sobrescreva as informações do outro usuário.

Lock-Modify-Unlock

Muitos sistemas de controle de versão utilizam o modelo lock-modify-unlock para resolver este problema.

Primeira Harry deve "bloquear" o arquivo antes de começar a fazer alterações. Se Harry tem bloqueado um arquivo, então Sally não poderá efetuar quaisquer alterações ao mesmo. Se ela tenta bloquear o arquivo, o repositório irá negar o pedido. Tudo o que Sally pode fazer é ler o arquivo, e esperar por Harry até que libere seu bloqueio. Após Harry desbloqueia o arquivo, agora Sally pode bloquear e editar o arquivo.

Copy-Modify-Merge

Subversion, CVS e outros sistemas de controle de versão utilizam um modelo Copy-Modify-Merge como uma alternativa ao bloqueio.

O modelo Copy-Modify-Merge pode parecer caótico, mas, na prática, corre muito suavemente. Os usuários podem trabalhar em paralelo, nunca à espera de um outro. E a quantidade de tempo que leva para resolver conflitos é muito menos do que o tempo perdido por um sistema de travamento. Porém existe o problema de comunicação, se a equipe envolvida tem pouco comunicação então os conflitos irão aumentar, nenhum sistema consegue resolver o problema de comunicação.

Command-line Subversion

  • SVN (comandos para cliente)
  • SVNLOOK (comandos para examinar diferentes aspectos)
  • SVNADMIN (comandos para monitoramento e reparos)
  • SVNSERVER (comandos para acesso do subversion usando network protocol)

TortoiseSVN

O TortoiseSVN é uma ferramenta gráfica, que se integra ao Windows® Explorer, que facilita o uso do Subversion para usuários do Windows®, uma vez que o Subversion básico é uma ferramenta de comandos em texto puro.

Principais Comandos

Este tópico tem a finalidade de mostrar alguns comandos do Subversion. Para utilizado em ambiente Windows, é necessário que seja instalado o cliente Subversion em linha de comando. Na Bireme, é utilizado comumente o TortoiseSVN ao invés da linha de comando, quando se trabalha com Windows, o cliente por linha de comando precisa ser instalado separadamente.

checkout

É utilizado para descarregar o código do projeto, mantendo o versionamento. Dessa forma, é possível manter o código atualizado, enviar novas atualizações, ver diferenças entre versões de arquivos, entre outras funcionalidades que podem ser encontradas no manual do Subversion.

No exemplo a seguir, é feito o checkout da versão do BVS-Site que está em desenvolvimento para uma pasta chamada bvs-trunk:

$ svn co svn://svn.reddes.bvsalud.org/bvs-site/bvs-site/trunk/ bvs-trunk

Repare que nesse momento será copiado todos os arquivos do repositório para a pasta local incluindo uma pasta de controle de versão “.svn”.

Revision keywords

HEAD A última (ou “mais recente”) revisão no repositório. (svn co svn://path -r HEAD)

BASE O número de revisão de um item em uma cópia de trabalho. Se o item tiver sido modificado localmente, a “versão BASE” refere-se à forma como o item estaria sem estas modificações locais. (svn log --revision BASE:HEAD)

COMMITED A revisão mais recente anterior, ou igual a, BASE, na qual o item foi modificado. (svn log --revision COMMITTED path)

PREV A revisão imediatamente anterior à última revisão na qual o item foi modificado. Tecnicamente, isto se resume a COMMITTED-1. (svn log --revision PREV path)

update

É utilizado para atualizar o código fonte local com o código fonte existente no repositório do Subversion. O update pode ser realizado sobre arquivo ou diretórios. Caso feito sobre um diretório, serão atualizados também todos arquivos deste diretório e subdiretórios.

O seguinte comando atualiza o arquivo index.php em bvs-trunk/htdocs:

$ svn update bvs-trunk/htdocs/index.php

O seguinte comando atualiza toda a pasta do projeto:

$ svn update bvs-trunk

add & del

São os comando usados para adicionar e excluir arquivos (respectivamente) no subversion.

$ svn add bvs-trunk/htdocs/info.php

ou

$ svn del bvs-trunk/htdocs/info.php

commit

Quando se modifica arquivo e deseja-se que a moficação seja aplicada também no repositório, é utiliza o comando commit, que envia ao servidor todas as alterações ocorridas no código local. Caso feito sobre um diretório, serão enviados também todos arquivos deste diretório e subdiretórios que tenham alguma modificação, ou que tenha sido adicionado.

O seguinte comando envia o arquivo index.php em bvs-trunk/htdocs:

$ svn ci bvs-trunk/htdocs/index.php

O seguinte comando envia ao servidor todos os arquivos da pasta do projeto:

$ svn ci bvs-trunk -m "Uma mensagem para descrever este commit"

Pode ser preciso autenticação para para se enviar um arquivo para o repositório. Quando este for o caso, pode-se utilizar os parâmetros --username e --password. Assim, o comando acima ficaria da seguinte forma:

$ svn ci bvs-trunk --username=fabio --password=f4b1O -m "Descrição para do commit"

Para os que trabalham com o Trac, é possível ter a interação entre os tickets abertos e as mensagens escritas para o commit. Pode-se, por exemplo, fechar um ticket através de um commit. O exemplo a seguir fecha o ticket de número 3.

$ svn ci bvs-trunk -m "resolve *3"

log

Para viasualizar o log de dos commits realizados asta usar os comandos:

$ svn log bvs-trunk/htdocs/index.php

revert

Nem sempre se quer que as alterções feitas seja enviadas para o repositório. Existem casos que é desejado desfazer as alterações feitas localmente. Para isso se utiliza o comando revert, que como os anteriores, pode ser aplicado sobre arquivos ou pastas.

O seguinte comando reverte as alteraç?s do arquivo index.php em bvs-trunk/htdocs:

$ svn revert bvs-trunk/htdocs/index.php

O seguinte comando reverte as alterações de todos os arquivos da pasta do projeto:

$ svn revert --recursive bvs-trunk
Importante: Não é possível desfazer o revert. Depois de feito, todas as alterações são perdidas!

status

Lista todas as diferenças existentes entre o código fonte local e o existente no repositório. Maiores informações sobre o significado das abreviações presentes no resultado podem ser encontradas digitando o seguinte:

svn help status

Mostra o estado do arquivo index.php em bvs-trunk/htdocs local, em relação ao servidor:

$ svn status bvs-trunk/htdocs/index.php

Lista o estado de todos arquivos e pastas locais em relação ao servidor:

$ svn status bvs-trunk

diff

Exibe as diferenças dos arquivos modificados com os arquivos presente no repositório. Esta ferramenta pode ser usada para criar patches. Isto pode ser feito criando um arquivo contendo diferença de todos arquivos modificados no projeto, da seguinte forma:

$ svn diff htdocs/admin/editor.php > editor.patch

Após esse comando, vai ser gerado um arquivo com as diferenças entre o arquivo editor.php local e o editor.php do repositório. Para este caso, o conteúdo do arquivo gerado é o seguinte:

Index: htdocs/admin/editor/editor.php
===================================================================
--- htdocs/admin/editor/editor.php      (revisão 3110)
+++ htdocs/admin/editor/editor.php      (cópia de trabalho)
@@ -57,7 +57,7 @@
        <form action="*" onsubmit="updateContent()" name="formEditor">
                <script language="JavaScript">
                        document.write('<textarea id="buffer">');
-                       document.write(opener.HTMLAreaElement.value);
+                       document.write(opener.HTMLAreaElement.innerHTML);
                        document.write('</textarea>');

                        document.write('<div align="center">');

Este patch pode ser aplicado em outro local que também tenha o código fonte, de preferência versionado e sob mesma revisão, do BVS-Site. A aplicação pode ser feita da seguinte forma:

$ patch -p0 < editor.patch

Visualizar diferenças da copia local com uma revisão especifica:

$ svn diff htdocs/admin/editor.php --revision 10 > editor.patch

propset

Este comando adiciona propriedades a arquivos e pastas versionados, para ajudar a gerenciar melhor os arquivos dentro da cópia local do código fonte.

svn:ignore

Diz ao Subversion não versionar arquivos com esta propriedade.

Faz com que nenhum arquivo adicionado em bases/site/rss seja versionado:

$ svn propset svn:ignore *
$ svn commit .

Retira arquivo bvs-site-conf.php do versionamento:

$ svn del bvs-trunk/htdocs/bvs-site-conf.php
$ svn propset svn:ignore bvs-trunk/htdocs/bvs-site-conf.php
$ svn commit bvs-trunk/htdocs

A propriedade é criada no escopo da pasta. Por isso faz-se commit da pasta e não do arquivo.

svn:mime-type

Esta propriedade é muito útil quando se usa o Trac. A maioria dos projetos da Bireme contém código e documentos escrito com o conjunto de caracteres ISO-8859-1. Quando estes documentos são vizualizados no Trac, acontecem alguns problema com acentos e caracteres especiais, pois o Trac assume que todo documento seja UTF-8 quando algo diferente não for especificado na propriedade svn:mime-type.

Diz ao SVN que o CHANGES.txt é um arquivo texto e com caracteres mapeados no ISO-8859-1.

$ svn propset svn:mime-type "text/plain;charset=iso-8859-1" bvs-trunk/CHANGES.txt

Outros comandos

info

Imprime informações dos arquivos locais.

$ svn info path

Retorno:

  • Path
  • Name
  • URL
  • Revision
  • Node Kind
  • Last Changed Author
  • Last Changed Revision
  • Last Changed Date
  • Text Last Updated
  • Properties Last Updated
  • Checksum

import

Importa arquivos de um path local para o repositório.

$ svn import –m “message” local_path svn_path

export

Exporta a arvore de diretórios.

$ svn export svn_path

Recupera a última versão do repositório sem os arquivos de controle de versão (.svn).

list

  • Lista diretórios no repositório
$ svn list svn_path
  • Lista diretórios no repositorio (ls unix)
$ svn list --versobe svn_path

blame

  • Mostra autor e revisão (annotate, praise e ann).
$ svn blame local_path 
  • Mostra autor e revisão especificando a revisão.
$ svn blame --revision x local_path 

resolved

Remove os arquivos criados pelo repositório na existência de conflito.

svn resolved local_path

Branches e Tags

Layout recomendado para repositório

  • path_projeto/trunk
  • path_projeto/tags
  • patch_projeto/branches
  1. Criando a pasta branches:
$ svn mkdir path/branches 
$ svn ci –m "message" path

Realizando essa comandos é adicionado uma nova pasta que usualmente chamada de branches/xxxx

  1. Copiando os arquivos do trunk e garantido o histórico:
$ svn copy  -m "Creating a private branch of /trunk.”  path/trunk  path/branches/xxx

Desta forma o histórico de versionamento do trunk é mantido até a copia do trunk para o branch.

  1. Criar as Tags. (Tag é um fotografia do projeto ao longo do tempo.)
$ svn copy path/trunk path/tags/release-1.0  -m "Tagging the 1.0 release of the ‘xxx’ project." 

Lembrando que uma tag e um branch são basicamente a mesma coisa o que diferencia é o fato de as tags não receberem commits

Fluxo de Trabalho no subversion

  1. Realizar atualização da cópia local;
  2. Realizar as alterações na cópia local;
  3. Atualizar repositório verificando a existência de conflitos;
  4. Submeter as alterações para o repositório, utilizando mensagens como forma de documentação.
  5. Criar branch para o ambiente do desenvolvedor em situações de muitas mudanças/alterações, evitando “lock” do trunk.

Truques

Patches a moda antiga

A forma mais utilizada na BIREME para se fazer patches é guardar arquivos de interesse em um arquivo tar.gz, preservendo seu caminho na estrutura de diretórios. Continuar a fazer isso tendo em mãos o diff do Subversion é questionável, mas pode ser preciso em algumas ocasiões. O seguinte exemplo visa fazer um patch para todos os arquivos adicionados e modificados na nossa cópia local do BVS-Site:

Obtendo lista de arquivos modificados e adicionados na cópia local

$ svn status . |grep -o -P '(?<=^[AM]\s{6,6}).*'

Usando o comando acima, pode-se criar o patch tar.gz

$ tar -czvf patch.tar.gz $(svn status . |grep -o -P '(?<=^[AM]\s{6,6}).*')

Revertendo arquivos apagados

A intenção é recuperar os arquivos que foram apagados da cópia local, mas que não foram apagados do repositório. A idéia é a mesma do tópico anterior: Utilizar o comando status para guiar o procedimento.

$ for f in $(svn status . |grep -o -P '(?<=^\!\s{6,6}).*'); do svn revert $f; done

Apagando arquivos não versionados

Retira todos os arquivos que estão presente na cópia local do código fonte, mas que não fazem parte do versionamento do projeto. Como tudo que envolve o comando rm, este é mais que se deve ter muito cuidado.

$ rm -f $(svn status . |grep -o -P '(?<=^\?\s{6,6}).*')

Leituras Recomendadas

Links Relacionados

Outros sistemas de controle de versão

Herramientas personales