********************* Subversion (svn) ********************* Introduções ====================== 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. .. warning:: Projetos/Pacotes hospedados em repositórios do Plone ou do Zope, continuam sendo mantidos com Subversion. Alguns projetos de clientes ainda usarão Git. Instalando ====================== Caminho fácil -------------- 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. MacOS ******* Usando o Darwin Ports: :: sudo port install subversion Linux - Debian/Ubuntu *********************** Usando o apt: :: sudo apt-get install subversion Linux - RedHat/CentOS/Fedora ****************************** Usando o yum: :: sudo yum install subversion Configurações Básicas ======================= 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. .. warning:: 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. Subversion 101 =================== 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. Lista de comandos ------------------- ============ ========== ======================================================== 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 ============ ========== ======================================================== Ciclo de trabalho ------------------------------ 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 svn commit svn commit svn update svn add MANIFEST.in svn commit MANIFEST.in