O Subversion (svn) é um sistema de controle de versões, uma evolução do CVS.
Ele se baseia na existência de um repositório único e centralizado, que mantém todo o histórico e as versões.
Para manipulação de alguma informação contida no repositório é necessário criar uma cópia de trabalho localmente.
Ao realizar alterações nas informações da cópia de trabalho ela se distancia da versão base mantida no repositório e estas alterações só são sincronizadas mediante a realização de um commit.
Historicamente a Simples Consultoria utilizou o Subversion para a gestão de seus códigos-fonte, com seu repositório em https://simplesnet.com.br/svn/. A partir de Abril de 2011 foi definido que os novos projetos utilizarão o Mercurial, hospedado no provedor Bitbucket, como controle de versão e que os projetos antigos serão gradualmente migrados para esta nova estrutura.
Aviso
Projetos/Pacotes hospedados em repositórios do Plone ou do Zope, continuam sendo mantidos com Subversion. Alguns projetos de clientes ainda usarão Git.
O jeito fácil e rápido de começar a trabalhar com o Subversion é através do uso de uma ferramenta com interface gráfica.
Em ambientes Windows, a mais famosa delas é o TortoiseSVN. Para sua instalação acesse http://tortoisesvn.net/downloads.html, baixe a versão mais recente e a instale.
Para ambientes MacOS e Linux existem diversas versões de GUI e inclusive uma cross-platform: RapidSVN .
Além disto, os gerenciadores de pacotes destes sistemas operacionais sempre contam com o pacote do Subversion.
A configuração do Subversion sempre pode ser realizada através da edição dos arquivos localizados na pasta .subversion na pasta raiz do usuário.
Boa parte das configurações é realizada no arquivo config, que é divido em algumas seções. A primeira seção é a [auth] onde é possível configurar como o Subversion se comportará com relação ao armazenamento de credenciais e senhas.
[auth]
store-passwords = yes
# store-auth-creds = no
#password-stores = windows-cryptoapi #Windows
#password-stores = gnome-keyring #Linux
password-stores = keychain #MacOS
No exemplo de configuração acima definimos que o Subversion armazenará as senhas para acesso aos respositórios e que utilizará o Keychain do MacOS como mecanismo de backend.
Caso você utilize Windows, comente a última linha e descomente a linha que indica windows-cryptoapi como backend.
Para Linux, comente a linha relativa ao MacOS e descomente a linha do gnome-keyring.
Aviso
Em servidores, quando utilizar o Subversion tenha certeza de que a configuração do arquivo config indique que store-auth-creds = no e store-passwords = no.
A próxima seção mais comumente editada é a que define aplicações auxiliares ao Subversion. A seção [helpers] define, por exemplo, qual o editor de texto a ser utilizado para documentar as ações realizadas.
Abaixo temos um exemplo desta seção já com algumas opções de editores listados.
[helpers]
editor-cmd = "mate -w"
#editor-cmd = "vim"
#editor-cmd = "gvim --nofork"
#editor-cmd = "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
O editor habilitado, neste exemplo, é o TextMate do MacOS. As opções seguintes configurariam o editor vim para ambiente terminal (Linux, MacOS), o gvim para ambientes gráficos em Linux e o Notepad++ para Windows.
A utilização do Subversion é bastante simples e direta. Contando com um repositório central, sempre é necessário realizar o checkout do código para a criação de uma cópia local.
Alterações são realizadas na cópia local, é realizada uma atualização da cópia de trabalho e as alterações locais sãoenviadas para o repositório central.
Comando | Atalho | Descrição |
---|---|---|
checkout | co | Cria uma cópia de trabalho a partir do repositório |
update | up | Atualiza a cópia local com a versão mais atual no repositório |
commit | ci | Envia as alterações da cópia de trabalho para o repositório |
revert | Reverte arquivo(s)/diretório(s) ao estado de sua última atualização junto ao repositório. | |
status | st | Informa qual a situação da cópia de trabalho |
add | Adiciona conteúdo à cópia local – e após um commit, ao repositório | |
remove | rm | Remove conteúdo do repositório ou da cópia de trabalho |
info | Exibe informações sobre o repositório, cópia de trabalho ou conteúdo | |
log | Exibe histórico sobre conteúdo ou repositório | |
diff | Exibe diferenças na cópia de trabalho ou em arquivos listados |
Inicialmente criamos uma cópia de trabalho a partir do repositório.
svn co https://svn.plone.org/svn/collective/sc.dev.core/trunk
Isto criará uma cópia de trabalho chamada trunk na pasta atual. É possível, desejável até, dar um nome arbitrário a cópia de trabalho
svn co https://svn.plone.org/svn/collective/sc.dev.core/trunk sc.dev.core
Após alterar o código do arquivo setup.py dentro da cópia de trabalho é possível efetivar a alteração no repositório realizando um commit
svn commit setup.py
Com isto este arquivo teve suas alterações enviadas para o repositório. No Subversion é usual que os commits agrupem alterações realizadas em vários arquivos. Para realizar o commit das alterações de uma pasta, docs por exemplo o comando seria:
svn commit docs/
Efetivando todas as alterações realizadas em arquivos sob esta pasta.
Podemos adicionar novos arquivos ao controle de versão:
svn add MANIFEST.in
E enviá-lo ao repositório:
svn commit MANIFEST.in
Também é possível remover um arquivo ou pasta na cópia de trabalho:
svn remove sc.dev.core.egg-info
Ou diretamente no repositório:
svn remove https://svn.plone.org/svn/collective/sc.dev.core/trunk/sc.dev.core.egg-info
O repositório pode ter sido alterado por outras pessoas, portanto é necessário sincronizar sua cópia de trabalho com a versão mais recente do servidor:
svn update
Que realizará esta ação para toda a cópia de trabalho, ou se você quiser sincronizar apenas uma pasta:
svn update docs
As diferenças entre a versão atual do conteúdo e sua última atualização podem ser exibidas com o comando diff:
svn diff docs
Para reverter as alterações ao estado de sua última sincronização com o repositório, usamos o comando revert:
svn revert docs
Para resumir, o ciclo é:
svn co https://svn.plone.org/svn/collective/sc.dev.core/trunk sc.dev.core
<modificações>
svn commit
<modificações>
svn commit
<sincronização>
svn update
<adiciona um arquivo>
svn add MANIFEST.in
svn commit MANIFEST.in