Como criar e usar um servidor Subversion (SVN)

Configurando Subversion [Artigo]

Como criar e usar um servidor Subversion (SVN)

Resumo

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


Introdução

Nesse documento estão descritas algumas maneiras de configurar um servidor svn e alguns comandos úteis para usá-lo.

Os pacotes necessários para a instalação e configuração são os seguintes:

  • httpd [ou apache ou apache2 (depende da distribuição)]

  • subversion

  • mod_dav_svn [ou subversion-server ou libapache2-svn (depende da distribuição)]

Partiremos do princípio que os pacotes do httpd já estejam instalados na máquina que será o servidor svn. Para outras informações úteis sobre svn temos "Apresentação da Ferramenta de Versionamento" e "Comandos úteis".

1. Site oficial

2. Instalando os pacotes svn

Como o yum calcula as dependências automaticamente, podemos iniciar com o módulo 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 repositório svn no servidor

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

# mkdir /var/svn
Agora vamos executar o comando necessário para criar o repositório /svn, vale lembrar que o comando abaixo deve ser executado em um diretório vazio, porém, já existente no sistema, pois o subversion irá apenas criar a estrutura necessária para o controle de versões, então execute o comando abaixo para tal procedimento:
# svnadmin create /var/svn
Vale uma observação aqui, até a versão 1.1 do subversion, o tipo de repositório padrão era o Berkeley DB, mas a partir da versão 1.2 o padrão passou a ser o FSFS. O suporte FSFS apareceu na versão 1.1. Na 1.0 apenas o Berkeley DB era suportado. Para especificar o tipo do repositório pode-se usar o argumento --fs-type:
# svnadmin create --fs-type fsfs /var/svn;
ou
# svnadmin create --fs-type bdb /var/svn
O repositório criado estará vazio e começará a contar a partir da revisão 0 (zero), a qual corresponderá à sua criação. Para mais informações sobre o tipo do repositório acesse:

Customizando o servidor SVN

4. svnserve, um servidor customizado

O programa svnserve é um servidor leve, capaz de comunicar-se com clientes através de TCP/IP utilizando um protocolo customizado. Clientes podem contatar um servidor svnserve através de URLs iniciadas por svn:// ou svn+ssh://. Neste tópico 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 repositórios.

4.1. Iniciando o servidor


Há algumas maneiras diferentes de iniciar o programa svnserve. Se iniciado sem opções, somente será mostrado uma mensagem de ajuda. No entanto, se pretendemos que o inetd inicie o processo, então podemos passar a opção -i (--inetd):

$ svnserve -i ( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )


Quando iniciado com a opção --inetd, o svnserve espera comunicar-se com um cliente Subversion através da entrada e saída padrão (stdin e stout) utilizando um protocolo customizado, um comportamento padrão para programas executados via inetd. A IANA (Internet Assigned Numbers Authority) reservou a porta 3690 para o protocolo Subversion, então em um sistema UNIX podemos adicionar as seguintes linhas ao arquivo /etc/services (se já não estiverem lá):

svn 3690/tcp # Subversion
svn 3690/udp # Subversion


E se o o sistema está usando um daemon inetd UNIX clássico, podemos adicionar esta linha ao /etc/inetd.conf:

svn stream tcp nowait svnowner /usr/bin/svnserve svnserve -i


Certifique que o usuário "svnowner" tem permissões apropriadas para acesso aos repositórios. Agora, quando uma conexão de um cliente chegar ao servidor na porta 3690, o inetd irá iniciar um processo do svnserve para atendê-la.

Uma segunda opção é rodar o svnserve como um "daemon" standalone. Para tal, utilize a opção -d:

$ svnserve -d


(svnserve agora está rodando, escutando a porta 3690)

Ao rodar o svnserve em modo daemon, você pode usar a opção --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 opção -t. Este modo assume que um programa de serviço remoto como RSH ou SSH autenticou com sucesso um usuário e está invocando um processo svnserve privado como aquele usuário.

O programa svnserve atua de maneira normal, assumindo que o tráfego 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 usuário autenticado tem permissão total de leitura e escrita no repositório.

É essencialmente o mesmo procedimento de um usuário local acessando o repositório através do método file:///. /> Autenticação e autorização integrada Quando um cliente se conecta a um processo svnserve, as seguintes situações acontecem:

  • O cliente seleciona um repositório específico;

  • O servidor processa o arquivo conf/svnserve.conf e aplica quaisquer políticas de autenticação e autorização lá definidas;

  • Dependendo da situação e das políticas de autorização:
    1. o cliente pode ser autorizado a fazer requisições anonimamente, sem autenticação;
    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ó é compatível com o método de autenticação 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 então a envia como resposta. O servidor calcula a assinatura em conjunto com a senha local para verificar que o resultado é idêntico. Em nenhum momento a senha do usuário atravessa a rede. Obviamente, também é possível que o cliente seja autenticado externamente através de um agente de tunelamento, como o SSH. Neste caso, o servidor simplesmente examina o usuário com o qual está executando e o utiliza para acessar o repositório. Como você já deve ter desconfiado, o arquivo svnserve.conf de um repositório é o mecanismo central de controle de autenticação e autorização. O arquivo tem o seguinte formato: seções são identificadas por colchetes - [], comentários são iniciados por cerquilha - #, e cada seção contém variáveis que podem ser ajustadas - variável = valor.

4.2. Criando um arquivo e domínio 'users'

Por ora, a seção [general] do arquivo svnserve.conf contém todas as variáveis de nosso interesse. Defina inicialmente um arquivo contendo usuários e senhas, bem como um domínio de autenticação:

[general] password-db = userfile realm = domínio exemplo

O domínio é um nome definido pelo administrador que indica aos clientes o domínio de autenticação ao qual estão se conectando; o cliente Subversion mostra esse domínio no prompt de autenticação, e o utiliza como uma chave (juntamente com o hostname do servidor e a porta) para fazer cache de credenciais no disco. A variável password-db aponta para um arquivo em separado que contém uma lista de usuários 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 diretórios até o arquivo users. Para muitos administradores, é conveniente manter o arquivo dentro do diretório conf/ do repositório, juntamente com svnserve.conf. Por outro lado, é possível que você deseje que dois ou mais repositórios compartilhem o mesmo arquivo users, caso em que o arquivo provavelmente deveria ficar em um local de acesso mais irrestrito. Os repositórios compartilhando o arquivo users poderiam ainda ser configurados para ter o mesmo domínio, já que uma lista de usuários define essencialmente um domínio. Qualquer que seja o diretório onde se encontra o arquivo, certifique-se de que as permissões de leitura e escrita estão ajustadas corretamente.

4.3. Ajuste de controle de acesso

Há ainda duas variáveis interessantes a serem ajustadas em svnserve.conf: elas determinam o que usuários não-autenticados (anônimos) e usuários autenticados poderão fazer no repositório. As variáveis 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 repositório. Por exemplo:

[general] password-db = userfile realm = domínio exemplo # usuários anônimos podem apenas ler do repositório anon-access = read # usuários autenticados podem ler e escrever auth-access = write

Essas configurações de exemplo são, de fato, os valores padronizados para as variáveis, caso não sejam definidas. Se você deseja ser ainda mais conservativo, você pode bloquear acesso anônimo por completo:

[general] password-db = userfile realm = domínio exemplo # usuários anônimos não são autorizados anon-access = none # usuários autenticados podem ler e escrever auth-access = write

Observe que o svnserve suporta apenas controle de acesso por usuário. Um usuário pode ou ter acesso universal de leitura e escrita, acesso universal de leitura ou nenhum acesso. Não há controle detalhado sobre diretórios específicos do repositório, o que, para muitos projetos, é suficiente e adequado. No entanto, se você necessita de controle de acesso por diretório, será necessário utilizar o mod_authz_svn do Apache (a ser visto no tópico 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 tópico em maior detalhe aos alunos interessados nesse tipo de configuração:

Configurando o apache para conexões http com svn

5. Configurar o apache para conexões http com svn

O apache é usado porque além de ser o servidor http mais usual, através do módulo mod_dav_svn.so ele consegue acessar um repositório svn e torná-lo acessível para clientes que usam o protocolo WebDAV? /DeltaV, (é o caso do comando svn, o qual veremos ainda neste documento), ele é uma extensão do protocolo HTTP.

Onde o arquivo de configuração, do subversion, é armazenado pode variar de distribuição para distribuição. 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 diretório.

Muitas vezes é possível localizá-lo através do comando locate:

# locate subversion.conf

ou
# rpm -ql mod_dav_svn |grep subversion.conf


Por isso, neste documento, trataremos o arquivo de configuração apenas por: subversion.conf.

Vamos abordar duas formas de configuração, são elas:

  • acesso irrestrito para leitura e escrita (sem senha)

  • acesso irrestrito para leitura e acesso restrito para escrita (com senha)

Antes de tudo faça um backup do arquivo de configuração original:

# cp subversion.conf subversion.conf.orig
No Fedora Core este arquivo já virá pré configurado, necessitando apenas completar alguns pontos das configurações vista neste documento.

6. Ajustar o dono do svn

Como vamos configurar o apache para o gerenciamento do repositório, é importante configurarmos o seu dono, pois estaremos lendo e escrevendo no svn através do protocolo HTTP. Mude o dono do diretório /var/svn de root para apache:

# chown -R apache.apache /var/svn
Essa modificação é necessária para que o svn fique acessível via http. Caso o usuário root continuasse como dono do diretório e dos demais arquivos, o apache não teria permissões para acessá-los. Em algumas distribuições o usuário chama-se www ao invés de apache, verifique o nome do usuário do apache antes de executar esse comando.

7. Acesso irrestrito para leitura e escrita

Abaixo segue um exemplo de configuração do arquivo subversion.conf para o acesso sem senha. Use-o caso deseje configurar um servidor svn sem senha.

# início 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 configuração do arquivo subversion.conf para o acesso com senha. Use-o caso deseje configurar um servidor svn com senha para escrita.

# início 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 usuário    AuthType Basic    AuthName "Subversion repository"    AuthUserFile /etc/httpd/securety/svn-passwd    # qualquer operação que não seja    # leitura requer um usuario valido    LimitExcept GET PROPFIND OPTIONS REPORT>    Require valid-user    </LimitExcept> </Location>

Mais informações 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á necessário criar o arquivo /etc/httpd/securety/svn-passwd ou o correspondente da sua configuração, onde serão armazenados os usuários, os quais terão acesso de escrita no repositório /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 usuário user seja informada. Para adicionar um novo usuário pode-se usar o comando abaixo:
# htpasswd /etc/httpd/securety/svn-passwd brito
O usuário digita a senha e o arquivo é automaticamente atualizado. Ou o usuário 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 usuário e a sua respectiva senha no arquivo correspondente.

10. Tornar o svn disponível no apache

Para efetivar as configurações e tornar o svn acessível através 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 máquina. 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 distribuição que estiver sendo usada, ou seja, ao invés de httpd pode ser apache ou até mesmo apache2. Agora o seu repositório svn já pode ser acessado, usando um navegador qualquer, através do endereço:
http://servidor/svn
Se o servidor svn foi configurado em sua rede, em casa, e não há nenhum dns configurado, para responder pelos nomes das máquinas, pode-se usar apenas o ip do servidor:
http://ip_do_servidor/svn
Alguns comandos úteis para manusear projetos no svn configurado. Após criarmos um repositório svn é interessante conhecermos alguns comandos que possibilitam o manuseio desta ferramenta. Se uma das variáveis de ambiente $SVN_EDITOR, $VISUAL ou $EDITOR não estiverem definidas, provavelmente uma mensagem de erro, semelhante a que segue abaixo, será exibida ao tentar efetuar uma alteração 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 padrão, 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 padrão será o vim. * Para que todos os usuários tenham essa variável configurada, basta adicionar a linha de comando acima no arquivo /etc/profile. Criar um diretório no svn. Antes de adicionarmos um projeto em nosso repositório precisamos criar o diretório onde ele ficará armazenado. Pode-se fazer isso através 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 máquina. 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 diretório /tmp/projeto para o repositório projeto em http://servidor/svn/

Uma outra maneira de executar o procedimento acima é acessar o diretório e então importá-lo para o svn:

# cd /tmp/projeto
# svn import http://servidor/svn/projeto

12. Baixar um projeto do svn

Quando for preciso efetuar modificações 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 alterações em um projeto do svn

Depois de concluídas as modificações necessárias precisamos colocar a nova revisão do projeto no svn, para isso precisamos efetuar um commit (check in).

De dentro do diretório principal do projeto efetue o commit:

# svn commit
ou
# svn ci

14. Listar arquivos de um projeto

Depois de efetuar várias mudanças em um projeto baixado do svn, é importante poder listar o seu conteúdo e saber quais arquivos estão armazenados e quais não estão no seu respectivo repositório no svn.

Para isso, execute o seguinte comando no diretório principal do projeto:

# svn list

15. Adicionar arquivos a um projeto

No decorrer de um projeto novos arquivos surgem e precisam ser adicionados no repositório svn.

Para efetuar essa operação 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 vão sendo incluso no projetos, há a necessidade de excluir alguns.

Use o seguinte comando para efetuar tal operação:

# svn rm projeto.c


É possível 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 revisão ele não fará mais parte do projeto.

16. Verificar as alterações antes de efetuar um commit

Na maioria das vezes é interessante, antes de efetuar o commit, verificar quais são as modificações.

Para isso usamos o svn diff. Porém, se existirem muitas modificações, é preciso jogar a saída do comando para um editor de texto, sendo no Linux, assim, possível analisar todo o diff gerado.

Executando apenas o svn diff:

# svn diff


Jogando a saída para um editor de texto, no caso o vim (Sistemas Operacionais Unix Like):

# svn diff | vim -


Lembrando que o comando acima mostra as diferenças do diretório onde foi executado e o seu correspondente no svn. Para verificar todas as modificações 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 diretório onde ele foi baixado e execute o seguinte comando:

# svn log

18. Obter ajuda dos próprios comandos

Para verificar os comandos disponíveis use:

# svn help


Uma série de comandos, possíveis, será listada. Para obter informações sobre um comando em específico use:

# svn comando --help

20. Obter Status

# svn st


Legenda:

  • U - o arquivo foi "Updated" (atualizado) a partir do servidor;

  • A - o arquivo ou diretório foi "Added" (adicionado) à sua working copy;

  • D - o arquivo ou diretório foi "Deleted" (deletado) da sua working copy;

  • R - o arquivo ou diretório foi "Replaced" (substituído) 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 repositório consegue percebê-los como arquivos diferentes;

  • G - o arquivo no servidor recebeu alterações, mas sua cópia local tinha as suas modificações; ou as alterações não interceptavam ou eram idênticas às suas, então o Subversion conseguiu colocá-las em estado de "merGed" (união) sem problemas;

  • C - o arquivo recebeu alterações "Conflicting" (conflitantes) com as suas, ou seja, na mesma seção do arquivo; trataremos deste caso mais adiante.

Dicas adicionais e bibliografia

21. Clientes gráficos

21.1. Interface gráfica de usuário (GUI) para SVN

  • RapidSVN fachada multi-plataforma em ambiente gráfico 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 extensão (addon) do Visual Studio .NET - Permite que as ações mais comuns sejam executadas diretamente da IDE.

21.2. Projetos Alternativos para SVN

  • subclipse projecto de software livre de integração do Subversion no Eclipse

  • JavaSVN projecto de software livre para criação de uma biblioteca de cliente Subversion 100% java

  • Subversion for MacOS X

22. Bibliografia


Atualizações

28/05/2008;

publicado também em http://www.vivaolinux.com.br/artigo/Configurando-Subversion
Versão PDF

Comentários

Anônimo disse…
Cara, em que servidor você esta instalando e configurando o SVN? Acho muito importante dizer este grande detalhe antes de fazer um tutorial, pois a instalação em servidores diferentes muda bastante apesar da logica ser a mesma.