Você está na página 1de 14

Como criar e usar um servidor Subversion (SVN)

Ricardo Brito do Nascimento


28 de maio de 2008

Resumo Subversion um software muito usado para controle de verses de sistemas. Muitas vezes desenvolvemos um projeto e precisamos ter um bom controle do seu versionamento, nesse caso o svn uma ferramenta muito interessante.

Introduo
Nesse documento esto descritas algumas maneiras de configurar um servidor svn e alguns comandos teis para us-lo. Os pacotes necessrios para a instalao e configurao so os seguintes: httpd [ou apache ou apache2 (depende da distribuio)] subversion mod_dav_svn [ou subversion-server ou libapache2-svn (depende da distribuio)] Partiremos do princpio que os pacotes do httpd j estejam instalados na mquina que ser o servidor svn. Para outras informaes teis sobre svn temos "Apresentao da Ferramenta de Versionamento" e "Comandos teis".

1. Site oficial
http://subversion.tigris.org/

2. Instalando os pacotes svn


Como o yum calcula as dependncias automaticamente, podemos iniciar com o mdulo para o protocolo httpd (apache), que o servidor svn ser juntamente instalado. # yum -y install mod_dav_svn
Resolved =================================================== Package Arch Version Repository Size =================================================== Installing: mod_dav_svn i386 1.4.2-2.fc6 updates 70 k subversion i386 1.4.2-2.fc6 updates 2.3 M Transaction Summary

=================================================== Install 2 Package(s) Update 0 Package(s) Remove 0 Package(s)

3. Criar um repositrio svn no servidor


Nos passos abaixo usaremos um repositrio chamado /var/svn, mas se desejar cri-lo em /home/usurio/svn, ou em qualquer outro local desejado, basta trocar /var/svn pelo qual ser usado em seu servidor. Antes de criar o repositrio precisamos ter o diretrio correspondente no sistema, por isso, use o comando abaixo para cri-lo: # mkdir /var/svn

Agora vamos executar o comando necessrio para criar o repositrio /svn, vale lembrar que o comando abaixo deve ser executado em um diretrio vazio, porm, j existente no sistema, pois o subversion ir apenas criar a estrutura necessria para o controle de verses, ento execute o comando abaixo para tal procedimento: # svnadmin create /var/svn Vale uma observao aqui, at a verso 1.1 do subversion, o tipo de repositrio padro era o Berkeley DB, mas a partir da verso 1.2 o padro passou a ser o FSFS. O suporte FSFS apareceu na verso 1.1. Na 1.0 apenas o Berkeley DB era suportado. Para especificar o tipo do repositrio pode-se usar o argumento --fs-type: # svnadmin create --fs-type fsfs /var/svn; ou # svnadmin create --fs-type bdb /var/svn

O repositrio criado estar vazio e comear a contar a partir da reviso 0 (zero), a qual corresponder sua criao. Para mais informaes sobre o tipo do repositrio acesse: http://svnbook.red-bean.com/nightly/en/svn.reposadmin.html

Customizando o servidor SVN


4. svnserve, um servidor customizado
O programa svnserve um servidor leve, capaz de comunicar-se com clientes atravs de TCP/IP utilizando um protocolo customizado. Clientes podem contatar um servidor svnserve atravs de URLs iniciadas por svn:// ou svn+ssh://. Neste tpico iremos explorar as diferentes maneiras de executar o svnserve, como os clientes se autenticam com esse servidor e como configurar controles de acessos apropriados para seus repositrios.

4.1. Iniciando o servidor


H algumas maneiras diferentes de iniciar o programa svnserve. Se iniciado sem opes, somente ser mostrado uma mensagem de ajuda. No entanto, se pretendemos que o inetd inicie o processo, ento podemos passar a opo -i (--inetd): $ svnserve -i ( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )

Quando iniciado com a opo --inetd, o svnserve espera comunicar-se com um cliente Subversion atravs da entrada e sada padro (stdin e stout) utilizando um protocolo customizado, um comportamento padro para programas executados via inetd. A IANA (Internet Assigned Numbers Authority) reservou a porta 3690 para o protocolo Subversion, ento em um sistema UNIX podemos adicionar as seguintes linhas ao arquivo /etc/services (se j no estiverem l): svn 3690/tcp # Subversion svn 3690/udp # Subversion E se o o sistema est usando um daemon inetd UNIX clssico, podemos adicionar esta linha ao /etc/inetd.conf: svn stream tcp nowait svnowner /usr/bin/svnserve svnserve -i Certifique que o usurio "svnowner" tem permisses apropriadas para acesso aos repositrios. Agora, quando uma conexo de um cliente chegar ao servidor na porta 3690, o inetd ir iniciar um processo do svnserve para atend-la. Uma segunda opo rodar o svnserve como um "daemon" standalone. Para tal, utilize a opo -d: $ svnserve -d

(svnserve agora est rodando, escutando a porta 3690) Ao rodar o svnserve em modo daemon, voc pode usar a opo --listen-port e --listen-host para

customizar a porta e hostname nos quais o "bind" ser efetuado. H ainda uma terceira maneira para invocar o svnserve, em modo "tunelamento", com a opo -t. Este modo assume que um programa de servio remoto como RSH ou SSH autenticou com sucesso um usurio e est invocando um processo svnserve privado como aquele usurio. O programa svnserve atua de maneira normal, assumindo que o trfego est sendo automaticamente redirecionado por algum tunelamento para o cliente. Quando o svnserve for invocado por um tunelamento, como descrito, certifique-se de que o usurio autenticado tem permisso total de leitura e escrita no repositrio. essencialmente o mesmo procedimento de um usurio local acessando o repositrio atravs do mtodo file:///. /> Autenticao e autorizao integrada Quando um cliente se conecta a um processo svnserve, as seguintes situaes acontecem: O cliente seleciona um repositrio especfico; O servidor processa o arquivo conf/svnserve.conf e aplica quaisquer polticas de autenticao e autorizao l definidas; Dependendo da situao e das polticas de autorizao: 1. o cliente pode ser autorizado a fazer requisies anonimamente, sem autenticao; 2. o cliente dever autenticar-se; 3. se operando em modo de tunelamento, o cliente ir declarar que j foi autenticado externamente. At o momento, o svnserve s compatvel com o mtodo de autenticao CRAM-MD5. Essencialmente, o servidor envia um pacote de dados ao cliente, que usa um algoritmo de hash MD5 para criar uma assinatura dos dados e da senha combinados, e ento a envia como resposta. O servidor calcula a assinatura em conjunto com a senha local para verificar que o resultado idntico. Em nenhum momento a senha do usurio atravessa a rede. Obviamente, tambm possvel que o cliente seja autenticado externamente atravs de um agente de tunelamento, como o SSH. Neste caso, o servidor simplesmente examina o usurio com o qual est executando e o utiliza para acessar o repositrio. Como voc j deve ter desconfiado, o arquivo svnserve.conf de um repositrio o mecanismo central de controle de autenticao e autorizao. O arquivo tem o seguinte formato: sees so identificadas por colchetes - [], comentrios so iniciados por cerquilha - #, e cada seo contm variveis que podem ser ajustadas - varivel = valor.

4.2. Criando um arquivo e domnio 'users'

Por ora, a seo [general] do arquivo svnserve.conf contm todas as variveis de nosso interesse. Defina inicialmente um arquivo contendo usurios e senhas, bem como um domnio de autenticao: [general] password-db = userfile realm = domnio exemplo O domnio um nome definido pelo administrador que indica aos clientes o domnio de autenticao ao qual esto se conectando; o cliente Subversion mostra esse domnio no prompt de autenticao, e o utiliza como uma chave (juntamente com o hostname do servidor e a porta) para fazer cache de

credenciais no disco. A varivel password-db aponta para um arquivo em separado que contm uma lista de usurios e senhas, utilizando o mesmo formato. Por exemplo: [users] joao = foopassword maria = barpassword O valor de password-db pode ser qualquer caminho absoluto ou relativo de diretrios at o arquivo users. Para muitos administradores, conveniente manter o arquivo dentro do diretrio conf/ do repositrio, juntamente com svnserve.conf. Por outro lado, possvel que voc deseje que dois ou mais repositrios compartilhem o mesmo arquivo users, caso em que o arquivo provavelmente deveria ficar em um local de acesso mais irrestrito. Os repositrios compartilhando o arquivo users poderiam ainda ser configurados para ter o mesmo domnio, j que uma lista de usurios define essencialmente um domnio. Qualquer que seja o diretrio onde se encontra o arquivo, certifique-se de que as permisses de leitura e escrita esto ajustadas corretamente.

4.3. Ajuste de controle de acesso

H ainda duas variveis interessantes a serem ajustadas em svnserve.conf: elas determinam o que usurios no-autenticados (annimos) e usurios autenticados podero fazer no repositrio. As variveis anon-access e auth-access podem ser ajustadas para os valores none, read ou write. Ajustando o valor para none restringe qualquer tipo de acesso; read permite acesso somente de leitura e write permite acesso completo de leitura e escrita ao repositrio. Por exemplo: [general] password-db = userfile realm = domnio exemplo # usurios annimos podem apenas ler do repositrio anon-access = read # usurios autenticados podem ler e escrever auth-access = write Essas configuraes de exemplo so, de fato, os valores padronizados para as variveis, caso no sejam definidas. Se voc deseja ser ainda mais conservativo, voc pode bloquear acesso annimo por completo: [general] password-db = userfile realm = domnio exemplo # usurios annimos no so autorizados anon-access = none # usurios autenticados podem ler e escrever auth-access = write Observe que o svnserve suporta apenas controle de acesso por usurio. Um usurio pode ou ter acesso

universal de leitura e escrita, acesso universal de leitura ou nenhum acesso. No h controle detalhado sobre diretrios especficos do repositrio, o que, para muitos projetos, suficiente e adequado. No entanto, se voc necessita de controle de acesso por diretrio, ser necessrio utilizar o mod_authz_svn do Apache (a ser visto no tpico seguinte), ou utilizar um hook pre-commit para controlar acesso de escrita. O controle de acesso via tunelamento bastante semelhante ao descrito anteriormente, mas, dada a especificidade do tema, deixamos aqui o link do SVN Book que explica esse tpico em maior detalhe aos alunos interessados nesse tipo de configurao: http://svnbook.red-bean.com/nightly/en/svn.serverconfig.svnserve.html

Configurando o apache para conexes http com svn


5. Configurar o apache para conexes http com svn
O apache usado porque alm de ser o servidor http mais usual, atravs do mdulo mod_dav_svn.so ele consegue acessar um repositrio svn e torn-lo acessvel para clientes que usam o protocolo WebDAV? /DeltaV, ( o caso do comando svn, o qual veremos ainda neste documento), ele uma extenso do protocolo HTTP. Onde o arquivo de configurao, do subversion, armazenado pode variar de distribuio para distribuio. Por exemplo, ele pode estar tanto em /etc/httpd/conf.d/subversion.conf, como em /etc/apache/conf/conf.d/subversion.conf, ou at mesmo em outro diretrio. Muitas vezes possvel localiz-lo atravs do comando locate: # locate subversion.conf ou # rpm -ql mod_dav_svn |grep subversion.conf

Por isso, neste documento, trataremos o arquivo de configurao apenas por: subversion.conf. Vamos abordar duas formas de configurao, so elas: acesso irrestrito para leitura e escrita (sem senha) acesso irrestrito para leitura e acesso restrito para escrita (com senha) Antes de tudo faa um backup do arquivo de configurao original:

# cp subversion.conf subversion.conf.orig

No Fedora Core este arquivo j vir pr configurado, necessitando apenas completar alguns pontos das configuraes vista neste documento.

6. Ajustar o dono do svn


Como vamos configurar o apache para o gerenciamento do repositrio, importante configurarmos o seu dono, pois estaremos lendo e escrevendo no svn atravs do protocolo HTTP. Mude o dono do diretrio /var/svn de root para apache: # chown -R apache.apache /var/svn

Essa modificao necessria para que o svn fique acessvel via http. Caso o usurio root continuasse como dono do diretrio e dos demais arquivos, o apache no teria permisses para acess-los. Em algumas distribuies o usurio chama-se www ao invs de apache, verifique o nome do usurio do apache antes de executar esse comando.

7. Acesso irrestrito para leitura e escrita


Abaixo segue um exemplo de configurao do arquivo subversion.conf para o acesso sem senha. Use-o caso deseje configurar um servidor svn sem senha. # incio do arquivo subversion.conf LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /var/svn> DAV svn SVNPath /var/svn # desativar senha SVNPathAuthz off </Location>

8. Acesso irrestrito para leitura e acesso restrito para escrita


Abaixo segue um exemplo de configurao do arquivo subversion.conf para o acesso com senha. Use-o caso deseje configurar um servidor svn com senha para escrita. # incio do arquivo subversion.conf LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /var/svn>

DAV svn SVNPath /var/svn # autenticando um usurio AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/httpd/securety/svn-passwd # qualquer operao que no seja # leitura requer um usuario valido LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location> Mais informaes sobre como configurar o arquivo subversion.conf.

9. Criar o arquivo de senha


Se o svn foi configurado com senha, como em um dos exemplos acima, ser necessrio criar o arquivo /etc/httpd/securety/svn-passwd ou o correspondente da sua configurao, onde sero armazenados os usurios, os quais tero acesso de escrita no repositrio /var/svn e suas respectivas senhas. Ele pode ser criado por meio do seguinte comando: # htpasswd -c /etc/httpd/securety/svn-passwd user

O comando acima cria o arquivo /etc/httpd/securety/svn-passwd e pede que a senha do usurio user seja informada. Para adicionar um novo usurio pode-se usar o comando abaixo: # htpasswd /etc/httpd/securety/svn-passwd brito

O usurio digita a senha e o arquivo automaticamente atualizado. Ou o usurio executa o seguinte comando: # htpasswd -n brito New password: Re-type new password: brito:QVZvldBtl6gZw

Envia o resultado do comando (em azul) para o administrador do svn e ele inclui o usurio e a sua respectiva senha no arquivo correspondente.

10. Tornar o svn disponvel no apache


Para efetivar as configuraes e tornar o svn acessvel atravs da url: http://nome_do_servidor/svn, precisamos iniciar o apache caso ele esteja parado ou reinici-lo, se ele j estiver sendo executado na mquina. O comando abaixo reinicia o apache estando ele ligado ou desligado: # service httpd stop && service httpd start; ou # service httpd restart; ou # /etc/init.d/httpd restart

Observe que o comando pode ser diferente dependendo da distribuio que estiver sendo usada, ou seja, ao invs de httpd pode ser apache ou at mesmo apache2. Agora o seu repositrio svn j pode ser acessado, usando um navegador qualquer, atravs do endereo: http://servidor/svn Se o servidor svn foi configurado em sua rede, em casa, e no h nenhum dns configurado, para responder pelos nomes das mquinas, pode-se usar apenas o ip do servidor: http://ip_do_servidor/svn Alguns comandos teis para manusear projetos no svn configurado. Aps criarmos um repositrio svn interessante conhecermos alguns comandos que possibilitam o manuseio desta ferramenta. Se uma das variveis de ambiente $SVN_EDITOR, $VISUAL ou $EDITOR no estiverem definidas, provavelmente uma mensagem de erro, semelhante a que segue abaixo, ser exibida ao tentar efetuar uma alterao no svn. svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR is set, and no 'editor-cmd' run-time configuration option was found Para definir o editor de texto padro, o qual ser usado para escrever os logs dos commits, pode-se usar a seguinte linha de comando: # export SVN_EDITOR='vim'

Acima definimos que o editor padro ser o vim. * Para que todos os usurios tenham essa varivel configurada, basta adicionar a linha de comando

acima no arquivo /etc/profile. Criar um diretrio no svn. Antes de adicionarmos um projeto em nosso repositrio precisamos criar o diretrio onde ele ficar armazenado. Pode-se fazer isso atravs do seguinte comando: # svn mkdir http://servidor/svn/projeto

Gerenciando projetos e arquivos no svn


11. Importar um projeto para o svn
Algumas vezes j temos um projeto em algum canto de nossa mquina. Importe-o para o svn usando a linha de comando abaixo: # svn import /tmp/projeto http://servidor/svn/projeto

O comando acima importar todos os arquivos do diretrio /tmp/projeto para o repositrio projeto em http://servidor/svn/ Uma outra maneira de executar o procedimento acima acessar o diretrio e ento import-lo para o svn: # cd /tmp/projeto # svn import http://servidor/svn/projeto

12. Baixar um projeto do svn


Quando for preciso efetuar modificaes em um projeto que j est no svn, antes preciso fazer o checkout, ou seja, efetuar o download dos arquivos correspondentes ao projeto. Efetuando o checkout: # svn co http://servidor/svn/projeto

13. Efetivar alteraes em um projeto do svn


Depois de concludas as modificaes necessrias precisamos colocar a nova reviso do projeto no svn, para isso precisamos efetuar um commit (check in). De dentro do diretrio principal do projeto efetue o commit: # svn commit ou # svn ci

14. Listar arquivos de um projeto


Depois de efetuar vrias mudanas em um projeto baixado do svn, importante poder listar o seu contedo e saber quais arquivos esto armazenados e quais no esto no seu respectivo repositrio no svn. Para isso, execute o seguinte comando no diretrio principal do projeto: # svn list

15. Adicionar arquivos a um projeto


No decorrer de um projeto novos arquivos surgem e precisam ser adicionados no repositrio svn. Para efetuar essa operao pode-se usar o seguinte comando: # svn add projeto.c

Quando o commit for efetuado, o arquivo projeto.c ser adicionado rvore correspondente do projeto em que estava trabalhando. Remover arquivos de um projeto: A medida que arquivos vo sendo incluso no projetos, h a necessidade de excluir alguns. Use o seguinte comando para efetuar tal operao: # svn rm projeto.c

possvel remover um projeto inteiro do svn, para isto basta executar: # svn rm http://servidor/svn/projeto

Quando o commit for efetuado, o arquivo projeto.c ser removido da rvore onde ele era armazenado e na nova reviso ele no far mais parte do projeto.

16. Verificar as alteraes antes de efetuar um commit


Na maioria das vezes interessante, antes de efetuar o commit, verificar quais so as modificaes. Para isso usamos o svn diff. Porm, se existirem muitas modificaes, preciso jogar a sada do comando para um editor de texto, sendo no Linux, assim, possvel analisar todo o diff gerado. Executando apenas o svn diff:

# svn diff

Jogando a sada para um editor de texto, no caso o vim (Sistemas Operacionais Unix Like): # svn diff | vim -

Lembrando que o comando acima mostra as diferenas do diretrio onde foi executado e o seu correspondente no svn. Para verificar todas as modificaes de um projeto, basta execut-lo na raiz principal dele.

17. Verificar o log de um projeto


Muitas vezes esquecemos o que fizemos, por isso, ao efetuar um commit o svn sempre pede uma mensagem para ser adicionada ao log do projeto. Para verificar os logs de um determinado projeto: efetue o checkout dele, acesse o diretrio onde ele foi baixado e execute o seguinte comando: # svn log

18. Obter ajuda dos prprios comandos


Para verificar os comandos disponveis use: # svn help

Uma srie de comandos, possveis, ser listada. Para obter informaes sobre um comando em especfico use: # svn comando --help

20. Obter Status


# svn st

Legenda: U - o arquivo foi "Updated" (atualizado) a partir do servidor; A - o arquivo ou diretrio foi "Added" (adicionado) sua working copy; D - o arquivo ou diretrio foi "Deleted" (deletado) da sua working copy; R - o arquivo ou diretrio foi "Replaced" (substitudo) em sua working copy, ou seja, um elemento foi deletado e posteriormente outro com o mesmo nome foi adicionado; embora tenham

o mesmo nome o repositrio consegue perceb-los como arquivos diferentes; G - o arquivo no servidor recebeu alteraes, mas sua cpia local tinha as suas modificaes; ou as alteraes no interceptavam ou eram idnticas s suas, ento o Subversion conseguiu coloclas em estado de "merGed" (unio) sem problemas; C - o arquivo recebeu alteraes "Conflicting" (conflitantes) com as suas, ou seja, na mesma seo do arquivo; trataremos deste caso mais adiante.

Dicas adicionais e bibliografia

21. Clientes grficos


21.1. Interface grfica de usurio (GUI) para SVN
RapidSVN fachada multi-plataforma em ambiente grfico de utilizador escrita em C++ e recorrendo biblioteca wxWidgets eSvn cliente baseado na biblioteca Qt JSVN cliente Java swing SmartSVN Cliente SubVersion para Linux, Windows e MAC TortoiseSVN Windows shell (i.e. Explorer) extension svnX MacOS X GUI front-end to svn AnkhSVN Windows uma extenso (addon) do Visual Studio .NET - Permite que as aes mais comuns sejam executadas diretamente da IDE.

21.2. Projetos Alternativos para SVN


subclipse projecto de software livre de integrao do Subversion no Eclipse JavaSVN projecto de software livre para criao de uma biblioteca de cliente Subversion 100% java Subversion for MacOS X

22. Bibliografia
http://www.dicas-l.com.br/dicas-l/20050909.php http://pt.wikipedia.org/wiki/Subversion http://en.wikipedia.org/wiki/Subversion

Atualizaes
28/05/2008; publicado tambm em http://www.vivaolinux.com.br/artigo/Configurando-Subversion