quinta-feira, 14 de agosto de 2008

Gerenciando o SVN (Subversion)

O funcionamento do SVN ocorre da seguinte forma: pega os arquivos do repositório (em um servidor SVN), faz as alterações necessárias, enviar de volta para o repositório (Backup). E assim sucessivamente.

1 - Algum conceitos importantes


Repositório - local onde você vai guardar o seu projeto. O repositório é uma pasta que é controlada pelo Subversion.

Cópia de Trabalho (Working Copy) - A cópia de trabalho fica alocada na sua máquina local. É onde o desenvolvedor faz modificações nos arquivos para depois armazenar no repositório (Backup) de um servidor SVN.


Ao criar o seu repositório, estruturá-lo através de 3 diretórios, assim:

+ trunk
+ branchs
+ tags

Isso é muito utilizado quando você tem uma aplicação de médio/grande porte onde você tem vários desenvolvedores ou mesmo naquelas que você tem previsão de muitos versões. A idéia aqui é dividir para facilitar.

No diretório trunk deve-se colocar o projeto inicial. Seria o que o pessoal chama de linha de desenvolvimento padrão. Você começa por ai e desenvolve tudo ai dentro.

Se por um acaso um desenvolvedor decide, de repente, adicionar uma funcionalidade revolucionária que não estava prevista no projeto, a idéia é que se faça isso em uma branch! Ou seja, você copia o estado atual da sua aplicação que está no diretório trunk para um subdiretório dentro de branch, por exemplo, vers_nova_funcionalidade. Isso é necessário porque imagine fazer isso na linha principal de desenvolvimento, ou seja, no diretório trunk. Pode acontecer que, por isto tudo ser um teste, quebrar a aplicação. Se você separa em um outro diretório, neste caso, um subdiretório dentro de Branch, você pode testar a vontade, sem prejudicar os outros desenvolvedores.

Outra explicação de uso de uma cópia dentro do branch é quando você fecha um projeto na sua versão 1.0 e ai decide que vai começar a versão 2.0, mas não quer deixar de dar suporte na versão 1.0, que é a que todo mundo usa. Nesse momento você continua com o desenvolvimento normal, da versão 2.0, dentro do trunk, e cópia tudo para um subdiretório, por exemplo, versao1.0, dentro do branch, e continua a versão 2.0 no diretório raiz.

O diretório tags é utilizado para criar uma cópia da sua aplicação(projeto) em um momento estável, uma versão a ser lançada no mercado, você vai e copia tudo, todos os seus arquivos, diretórios, etc, para um subdiretório dentro de Tags, como por exemplo, versao1.0. Tudo bem, fica tudo muito organizado, mas já imaginou a quantidade de arquivos que eu vou ter na minha máquina? Um bocado, repetido em tudo que é canto ! Ai que está. O Subversion controla tudo isso de maneira magistral, só copiando o que deve ser copiado e fazendo links simbólicos internos. Ou seja, você terá o mínimo de arquivos duplicados.

Tudo isso é apenas convensão para sua organização. Se você não quiser. Não precisa criar diretório trunk ou branch ou tag ou qualquer outro.

O comando update tratará de atualizar a sua versão da cópia de trabalho de acordo com a que está no repositório. Também é utilizado, quando você quer pegar uma versão qualquer do seu projeto, que não a última, ou mesmo, uma versão que está em algum branch.

Caso você queira trabalhar em um branch específico, por exemplo, uma versão 2 que você está desenvolvendo, em vez da linha de desenvolvimento principal:

$ svn checkout http://localhost/svn/projeto/branchs/ver1.0

2 – Adicionado/Removendo arquivo ou diretório para controle do SVN


Toda e qualquer alteração na sua cópia de trabalho não é automaticamente controlada pelo subversion. Uma vez que você tenha alterado um arquivo, você precisa dizer para o subversion que você alterou e que ele deve ser enviado para o repositório.

Entre no diretório local do projeto que alterou e execute o comando:

$ svn commit --message "Arquivo texto_5.txt modificado"

Quando quiser realmente adicionar ou remover um diretório ou arquivo, você deve fazer isso com os comandos do subversion. Não adianta usar mkdir, rm ... , quando utilizados causa a impressão que funciona, mas quando executa o commit as alterações não são enviadas ao servidor. Para adicionar ou deletar um arquivo ou diretório para o controle do subversion utilize o comando:
$ svn add “Arquivo ou Diretório”
$ svn delete “Arquivo ou Diretório”

Depois execute o commit, enviando as alterações feitas de volta para o repositório:

$ svn commit -m “Novo arquivo adicionado/removido ao repositório”

A cada commit o número da revisão é incrementado e a cada arquivo criado, deve-se adicioná-lo ao repositório. Existem programas com interface gráfica para fazer esse trabalho. Ex: rapidSVN, o TortoiseSVN(para windows),

Caso remova um diretório ou arquivo e depois se arrependa basta executar:

$ svn update
OBS: Isso antes de executar o commit, esse comando volta para a revisão atual, sincronizando com o servidor, perdendo todas as modificações feitas localmente.

3 – Recuperando dados de uma revisão anterior

svn update - Atualiza a cópia do repositório, caso tenha ocorrido alguma mudança.

svn log - Exibe as alterações feitas ao repositório.

svn resolved arquivo - Indica ao subversion que você já resolveu os conflitos desse arquivo

Se você executa o commit e gera a Revision 5 e depois perceba que deletou um arquivo importante ou desejar voltar em algum arquivo da versão anterior, basta você dizer para o subversion que atualize a sua cópia de trabalho para a revisão anterior, no exemplo a Revision 4.

Antes é necessário saber para qual versão voltar para isso execute:

# svn log //mostra os comentários de cada revisão
ou
# svn log –verbose //mostra os arquivos de cada revisão.

Depois de verificada para qual revisão deseja retornar, execute por exemplo:

# svn update -r4
Atualizado para revisão 4.

Agora você está na revision 4 na sua máquina local,

# svn update //você retorna a última revision.

Recuperando um arquivo da revision 4, apagado por algum motivo, para o revision atual.

$ svn copy -r4 http://ip_servidor/svn/projeto/trunk/globals.inc /project/teste/

Esse comando pega o arquivo globals.inc do revision 4 e copia para o local do projeto onde foi feito o checkout. Agora para adicionar o arquivo globals.inc novamente ao projeto faça:

$ cd /project/teste

$ svn add globals.inc

$ svn commit -m "globals.inc novamente incrementado"

OBS – Caso Delete um arquivo e queria recuperar. Se você ainda não deu commit é facil: use o comando svn revert. Ele irá retornar o diretório para a última versão. Agora, se você já deu um commit no repositório, você precisará copiar o arquivo deletado diretamente do repositório. Siga os passos acima.

Nenhum comentário: