29 Mai
Posted by Diego Albuquerque as Desenvolvimento, Subversion

Este é um pequeno artigo que tem a intenção de resumir , para iniciantes no assunto, como eu, as principais funcionalidades e conceitos por trás do controle de versão (versionamento) feito através do Subversion ou SVN.
Atenção! Este artigo foi todo baseado no UBUNTU, mas pode ser facilmente modificado para se aplicar em qualquer S.O, como o windows.
Como o título pode sugerir, não pretendo aqui abordar as inúmeras funcionalidades ou mesmo mostrar todo o poder do subversion. Sou um programador PHP que, a maioria do tempo, trabalho sozinho nos meus projetos, apenas sendo ajudado no que tange ao projeto gráfico dos sites pelos meus amigos.
A idéia é mostrar como usar, de forma prática, o controle de versão, por pessoas como eu, que não obrigatoriamente estão trabalhando em grandes equipes. Deixando claro que, os conceitos aqui apresentados, poderão ser extendidos.
Começemos pelo começo !
Para que serve este negócio de controle de versão ?! A finalidade é dar um controle maior sobre tudo que você altera no seu projeto!
Pausa para explicação!
Projeto: Nome que inventamos de dar a um monte de arquivo e diretório junto! Ou seja, para o Subversion é tudo arquivo e diretório! Problema seu se você quis chamar isso de projeto!
Digamos que ele permite você ter um histórico de tudo que você fizer. Se você modificou aquela rotina para otimizar uma
consulta, se você inseriu uma nova função e retirou outra, se você modificou a imagem que era exibida em determinada página html, tudo fica lá guardado! Pra que isso ? Para o caso de sua alteração causar algum problema! Se deu você nem precisa se preocupar em relembrar o que foi que tinha alterado, se fez tudo correto, basta um simples comando e você recupera o estado anterior.
O Melhor de tudo, na minha opinião, é que você fica livre para mexer como quiser no seu projeto sem precisar ficar fazendo backups !
Vai me dizer que você nunca pegou um arquivo fonte para alterar aquela função vital e só por via das dúvidas fez um backup e deixou lá : arquivoFonte.bkp. Ai depois precisou fazer outra alteração, e lá foi você fazer um outro backup : arquivoFonte-20070507.bkp ?! Ou ainda resolveu fazer uma alteração substancial em várias partes do site e ai resolveu, por via das dúvidas, copiar todo o diretório e criar um outro: projetoBackup ! Nunca fez isso ? Sorte sua amigo, pois muita gente faz isso e fica com aquele monnnte de arquivos no diretório.
Vamos só explicar, antes de mais nada, alguns conceitos.
<conceitos>
Repositório!
Segundo o Houaiss, lugar onde se guarda, arquiva, coleciona alguma coisa. Traduzindo. Nada mais é do que o local onde você vai guardar o seu projeto. Na prática, é um diretório, uma pasta qualquer guardada ou no seu computador, ou no seu pendrive, ou em um server na china.
Repositório = Diretório = Pasta
A única diferença entre um repositório e um diretório qualquer do seu disco, é que o repositório é uma pasta que é controlada pelo Subversion, ou seja, ele vai colocar um bocado de coisa lá dentro e vai controlar tudo. Logo, não se preocupe se você não entender o que tem lá dentro. Simplesmente saiba que ele vai controlar tudo direitinho.
Cópia de Trabalho (Working Copy)
Novamente, nada mais é que um Diretório, pasta, qualquer.
Comece a perceber que,para o subversion, tudo se resume a diretórios (pastas) e arquivos. Este negócio de repositório, Cópia de Trabalho, Projeto, é tudo criação da sua cabeça.
A única diferença deste diretório para o Repositório, é que é neste que você trabalha, ou seja, faz as modificações, cria, apaga as coisas. O outro (repositório), é o seu Backup, para onde você manda, por segurança, tudo que você alterou, criou, apagou.
Se tudo é Diretório, qual a diferença entre um diretório qualquer do meu HD, para o Repositório e para a Cópia de Trabalho ? A única diferença é que o Subversion tem controle sobre estas duas últimas, não fazendo a mínima idéia do que fazer sobre todas as outras!
</conceitos>
Resumão!
Tudo se resume a pegar os arquivos do repositório (como quem tira os cadernos da gaveta), fazer as alterações necessárias, enviar de volta para o repositório (guardar os cadernos novamente). E assim sucessivamente.
Vamos Detalhar um pouquinho melhor!
Lembre-se: Você vai trabalhar em um diretório, que chamamos de Cópia de Trabalho (Working Copy) !
O funcionamento básico do controle de versão, resumidamente, consiste em:
Criou o Supusitório? Opa, é repositório rapá!
(SVNADMIN CREATE)
Caso ainda não exista uma pasta no seu computador, no seu pendrive, em um servidor qualquer da china, é hora de criar o repositório. Claro, você só vai criar se você tiver este poder né mesmo! A Idéia deste artigo é mostrar como isso é feito localmente, na sua máquina mesmo. Caso necessite, existem servidores pagos e gratuitos , como o projeto OpenSVN (https://opensvn.csie.org/) que permite que você tenha um repositório longe do seu computador.
Para criar um repositório, você vai utilizar o comando svn create. Como a idéia aqui é mostrar como utlizar o subversion, do ponto de vista , de um programador que trabalha sozinho, este passo será necessário. A não ser que se escolha utilizar um servidor externo.
O processo é simples. Basta digitar :
$svnadmin create <CaminhoDoDiretorio>
Este comando irá criar o Diretório que será considerado o repositório do seu projeto.
Eu tou começando a usar o meu pendrive como repositório. Isso mesmo. Crio o meu repositório no meu pendrive, e ele vai comigo para onde eu quiser. Quando eu chego em outro micro, plugo o pendrive, faço um checkout (explicado mais abaixo), trabalho do jeito que eu quero, e no final, basta desplugar o mesmo, clocar no bolso e ir pra casa. Qual a vantagem disso em relação a um servidor externo ? Boa pergunta! Velocidade, e acesso aos meus projetos, mesmo em micros sem acesso a internet. Qual a desvantagem ? A inicial é que só eu posso usar isso, ou seja, se quiser um repositório compartilhado com mais pessoas, não dá.
Exemplo Prático:
$mkdir /home/diego/repositorio
$svnadmin create /home/diego/repositorio/sitePessoal
Vai começá ? Coloque as coisa sob o chicote do seu Subversion!
(SVN IMPORT)
Uma vez que o repositório esteja criado, ou tenha sido escolhido, deve-se pegar os arquivos do seu projeto, que deverão estar em uma pasta qualquer, e colocar no mesmo, para que o subversion possa começar a controlar as alterações que você fizer! Imagine isso como um Backup inicial de tudo que você já tem ou não tem.
Pausa para alguns conceitos!
O pessoal que trabalha com Controle de Versão, adora definir algumas coisas como “boa prática” ou mesmo como “regras”, mas nada disso que vou falar abaixo, é obrigatório de ser utilizado.Como já vimos anteriormente a única coisa que o subversion entende são arquivos e diretórios, logo pouco importa o nome que damos a eles, ok ?
O “Povo”, que utiliza o subversion, defende duas correntes. Uma diz que você deve criar um repositório (Diretório) para cada projeto. Assim:
RepositorioAplicacao1
RepositorioAplicacao2
E outra que você deve ter um único repositório (diretório), guardando vários projetos. Assim:
Repositorio
+——- Aplicacao1
‘——– Aplicacao2
E ai, qual usar ? Bem, pra mim, tanto faz. O Subversion só entende diretórios mesmo. Claro, isso no entendimento básico. Como não sou nenhum expert, me parece que tem sim diferença quando você começa a usar permissionamento de quem pode mexer em que.
Outra é que, independente de como você escolheu acima, deve, ao criar o seu repositório ,estruturá-lo através de 3 diretórios, assim:
RepositorioAplicacao
+——— trunk
+——— branchs
‘———- tagsPra que isso ? E eu sei lá! Brincadeira! Explico.
Bem, 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 você (ou outro desenvolvedor) decide, de repente, adicionar uma funcionalidade revolucionária que não estava prevista no projeto como por exemplo, a implementação de uma comunicação audio/visual em tempo real para habitantes de outros planetas, a idéia é que você faça isso em uma branch! Ou seja, você copia o estado atual da sua aplicação, ou seja, copia os arquivos todos, que estão no diretório trunk para um subdiretório dentro de branch, por exemplo, vers_comunicador_marte. Por que isso ? Porque imagine que você decida fazer isso na linha principal de desenvolvimento, ou seja, no diretório trunk. O que pode acontcer ? Pode acontecer de, 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 pertubar os outros, concorda ?! Então é isso! :D
Quer ver outra explicação porquê você deve fazer uma cópia dentro do branch ? Imagine que você esteja desenvolvendo a sua aplicação, digamos versão 1.0, e ai decide que vai começar a versão 2.0, que terá umas funcionalidades malucas, mas não quer deixar de dar suporte na versão 1.0, que é a que todo mundo usa. O que você faz ? Você continua com o desenvolvimento normal, da versão 1.0, dentro do trunk, e cópia tudo para um subdiretório, por exemplo, versao2, dentro do branch, e começa a trabalhar nesta nova versão lá. Sacou ?
Beleza! E o diretório tags ?! Bem, este diretório é utilizado para criar um snapshot, um instantâneo da sua aplicação. Como assim ? Quando o pessoal vai desenvolvendo uma aplicação e vem corrigindo bugs, adicionando funcionalidades extras, etc, geralmente o que fazem é dar nomes ou números a estas versões , correto ? Por exemplo: aplicacao_ver_1.0, aplicacao_ver_1.1, etc.
A questão é, como será que você faria para distribuir esta aplicação ? Bem, você faria uma cópia da sua aplicação naquele exato momento que você definiu como uma nova versão, empacotaria e pronto! Estaria feito a versão 1.XX.YY, ok ? E se daqui a duas semanas, resolvesse que deveria lancar uma outra versão que corrigisse uns bugs, faria a mesma coisa, correto ? Bem, a idéia aqui é a mesma. Só que você vai deixar o subversion controlar isso pra você.
O que o pessoal faz, e você vai fazer, se quiser claro, é, quando decidir que uma aplicação deve ter uma nova versão lançada, você vai e copia tudo, todos os seus arquivos, diretórios, etc, para um subdiretório dentro de Tags, como por exemplo, versao1.1. E se daqui a duas semanas decide que vai lançar outra versão, cópia tudo de novo para um outro diretório, dentro de Tags, chamado versao1.2, ok ?
A questão é que, quando você acessar o diretório trunk, você terá o desenvovimento principal da sua aplicação, ou seja, o que você vem mexendo no dia a dia.
Quando você acessar um subdiretório dentro de branch, você estará acessando uma versão que você ainda está desenvolvendo e testando. É uma outra linha de desenvolvimento.
E dentro de tags, você terá instantâneos da sua aplicação em momentos que você definiu, sacou ?
E ai você pode perguntar. Beleza, 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 ,etc, etc, etc. Ou seja, você terá o mínimo de arquivos duplicados.
Resumo da história. 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. Como falei antes, o Subversion entende apenas diretórios e arquivos, ou seja, para ele, trunk, branchs, tags são apenas diretórios, você ou quem utiliza que convenciona como vai utilizá-los. Isso é tão verdade, que se você quiser, nem precisa criá-los ou pode até criá-los com outros nomes, por exemplo: Em vez de trunk, colocar LinhaPrincipal, em vez de Branchs, LInhasDeTestes e em vez de Tags, VersoesLancadas.
E isso se aplica a desenvolvimento de sites ? Bem, ai é com vocês! Se achar que se aplica, utilize para organizar melhor as coisas, se não, esqueça e pronto. Só Lembre-se: TUDO É DIRETÒRIO e OPERAÇÕES DE BACKUP.
E depois de tudo isso, o que eu devo fazer, pelo amor de Deus ?
Bem, se você quiser utilizar o que falei acima, ou seja, utilizar estas convenções, crie os diretórios trunk, branchs, tags, coloque toda a sua aplicação (arquivos fontes, diretórios, etc) dentro do trunk, e importe tudo para o repositório. Este ato de importar, está indicando para o subversion que ele deve copiar tudo que está na sua pasta para o seu repositório e deve começar a controlar as coisas.
Continuando o Exemplo Prático:
Continuando o exemplo anterior$cd /home/diego/temp
$mkdir MinhaAplicacao
$mkdir MinhaAplicacao/trunk
$mkdir MinhaAplicacao/branchs
$mkdir MinhaAplicacao/tags
$cd MinhaAplicacao
Observação: Caso você já tenha algo desenvolvido do seu projeto, conforme a convenção explicada acima, coloque tudo dentro do diretório trunk.
$svn import . file:///home/diego/repositorio/sitePessoal/trunk/Observação2: Estou utilizando, nos exemplos, um repositório local, que fica na mesma máquina. Como dito anteriormente, o mesmo pode estar em um servidor remoto, e ai o acesso pode se dar pelo protocolo http. Neste caso você utilizaria, no lugar de file://, http://<servidor>/<Repositorio>
Atente para o fato de que, mesmo estando na mesma máquina, o acesso ao repositório, feito pelo svn, é através de uma URL, neste caso file://.
E esse tar de Uorqui Copí ?!
(SVN CHECKOUT)
Como explicado anteriormente, o subversion só controla dois diretórios: O repositório e a Cópia de Trabalho. É necessário, caso você ainda não possua, criar uma cópia de trabalho. Isso nada mais é do que pegar o que tem no seu repositório, ou seja, seu backup, e colocar em uma pasta qualquer. A partir deste momento, você terá uma cópia de trabalho do seu projeto, onde deverá efetuar todas as alterações.
Atenção! Atenção! LEIA RAPÁ !
Quando você faz o IMPORT do seu projeto para o repositório, como explicado no item anterior, o diretório não fica automaticamente controlado pelo Subversion! Por isso ele pode ser descartado, apagado, jogado fora, esquecido, deletado. Entendeu ?
Logo, para começar a trabalhar no seu projeto, depois de importá-lo para o repositório, é obrigatório que você faça um checkout, ou seja, copie tuuuuudo de volta, do repositório para algum diretório (work copy).
Este processo de checkout é sempre utilizado quando se vai começar a trabalhar no projeto, caso você não possua uma cópia de trabalho (work copy), em sua máquina ou em uma máquina nova. Caso já possua, geralmente se faz um update apenas, que 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.
Continuando o exemplo prático
$mkdir /home/diego/projetos/CopiaTrabalhoSitePessoal
$cd /home/diego/projetos/CopiaTrabalhoSitePessoal
$svn checkout file:///home/diego/repositorio/sitePessoal/trunk/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 file:///home/diego/repositorio/sitePessoal/branchs/ver2
Não sei se vocês notaram, mas até agora, tudo se resumiu a copiar de um diretório para outro, só que ao invés de usar comandos do sistema operacional, estamos usando o subversion.
Alterô os Arquivo ?! Ouxe, Diz pro Seu Subversion cuidá dêles.
(SVN COMMIT)
Toda e qualquer alteração na sua cópia de trabalho não é automaticamente controlada pelo subversion! Não? Não! 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!
Opa! Perai! Mas se o repositório é um backup, ele vai apagar meu backup anterior! Naaada disso! Ai é onde está o pulo do gato. O Subversion, não apagar nunca seus arquivos, apenas ele vai criar uma nova versão do seu arquivo lá! Ou seja, vai existir a cópia anterior e a nova cópia! :D Isso é o que se chama de revisão. Toda vez que você altera algo e manda para o repositório, você está criando uma nova revisão.
Continuando o exemplo prático
$cd /home/diego/projetos/CopiaTrabalhoSitePessoal
$svn commit file:///home/diego/repositorio/sitePessoal/trunk/
Criô ? Apagô ? Tá bulindo nas coisa né ? Vô dizê pro Seu Subversion!
(SVN ADD, DELETE, MKDIR, etc)
Assim como as alterações nos arquivos, quando você cria um novo diretório dentro do seu projeto, apaga, mude de lugar, ou seja, mexe na estrutura do seu projeto, você precisa informar isso para o Subversion.
Tudo isso é feito através dos comandos ADD, DELETE, MKDIR, etc. Veja abaixo, no Exemplo Prático da Vida Real, como trabalhar com estes comandos.
E se eu já tô cum minha Uorqui Copi, como qui eu dexo ela atualizadinha ?
(SVN UPDATE)
Isso é feito através do comando UPDATE, que tem a finalidade de atualizar a sua cópia de trabalho.
E como é que se mexe nestes tar de BRUNCH, TAG ?
Quer saber mesmo ? Então veja o Exemplo Prático da Vida Real abaixo. É facim facim.
1. Criando o Repositório em uma pasta qualquer
/tmp# mkdir repositorios
/tmp# cd repositorios/
/tmp/repositorios# svnadmin create HelloWord
/tmp/repositorios# ls -lh
total 4,0K
drwxr-xr-x 7 root root 4,0K 2007-05-29 09:31 HelloWord
/tmp/repositorios# ls -lh HelloWord/
total 28K
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:31 conf
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:31 dav
drwxr-sr-x 5 root root 4,0K 2007-05-29 09:31 db
-r–r–r– 1 root root 2 2007-05-29 09:31 format
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:31 hooks
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:31 locks
-rw-r–r– 1 root root 229 2007-05-29 09:31 README.txt
2. Criando o diretório e estrutura da nossa futura aplicação.
/tmp/repositorios# cd ..
/tmp# mkdir HelloWord
/tmp# cd HelloWord
/tmp/HelloWord# mkdir trunk
/tmp/HelloWord# mkdir branchs
/tmp/HelloWord# mkdir tags
/tmp/HelloWord# ls -lh
total 12K
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:38 branchs
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:38 tags
drwxr-xr-x 2 root root 4,0K 2007-05-29 09:38 trunk
/tmp/HelloWord# cd trunk
/tmp/HelloWord/trunk# echo “<?php echo ‘pagina inicial’; ?>” > index.php
/tmp/HelloWord/trunk# cat index.php
<?php echo ‘pagina inicial’; ?>
/tmp/HelloWord/trunk# ls -lh
total 4,0K
-rw-r–r– 1 root root 32 2007-05-29 09:41 index.php
3. Importando (enviando) a aplicação para o repositório.
/tmp/HelloWord/trunk# cd ..
/tmp/HelloWord# svn import . file:///tmp/repositorios/HelloWord/ \
-m “Importacao Inicial”Adicionando branchs
Adicionando trunk
Adicionando trunk/index.php
Adicionando tagsCommit da revisão 1.
/tmp/HelloWord# ls -lh /tmp/repositorios/HelloWord/
total 28K
drwxr-xr-x 2 root root 4,0K 2007-05-29 10:09 conf
drwxr-xr-x 2 root root 4,0K 2007-05-29 10:09 dav
drwxr-sr-x 5 root root 4,0K 2007-05-29 10:09 db
-r–r–r– 1 root root 2 2007-05-29 10:09 format
drwxr-xr-x 2 root root 4,0K 2007-05-29 10:09 hooks
drwxr-xr-x 2 root root 4,0K 2007-05-29 10:09 locks
-rw-r–r– 1 root root 229 2007-05-29 10:09 README.txt
Observe que a estrutura de diretórios do repositório, apesar da importação(cópia), não mudou em nada, pois o subversion trata de controlar tudo isso internamente. Era de se esperar que aparecessem as pasta s trunk, branchs, tags dentro de /tmp/repositorios/HelloWord, já que a importação nada mais é do que uma cópia não é mesmo ? ;D
Observe também que todas as operações com o subversion, de importação, de update, de checkout, etc, devem ser realizadas na raiz do projeto, neste caso o diretório /tmp/HelloWord.
4. Apagando o conteúdo do diretório, que já não é mais necessário, e que não é controlado pelo subversion, e fazendo o primeiro checkout.
/tmp/HelloWord# rm * -r
/tmp/HelloWord# svn checkout file:///tmp/repositorios/HelloWord/trunk .
A index.php
Gerado cópia de trabalho para revisão 1.
/tmp/HelloWord# ls -lh
total 4,0K
-rw-r–r– 1 root root 32 2007-05-29 10:19 index.php
Observe que, como pedimos para fazer o checkout do trunk, veio apenas o arquivo index.php. Lembre-se, não ficaremos fazendo checkout de toda a estrutura que importamos, mas apenas do que nos interessa, ou seja, o que estiver dentro do trunk, ou de branchs ou mesmo de tags.
5. Alterando o conteúdo do arquivo e dando commit para forçar a atualização do Repositório.
/tmp/HelloWord# echo “<?php echo ‘linha2′; ?>” >> index.php
/tmp/HelloWord# cat index.php
<?php echo ‘pagina inicial’; ?>
<?php echo ‘linha2′; ?>/tmp/HelloWord# svn status
M index.php/tmp/HelloWord# svn commit -m “index.php modificado”
Enviando index.php
Transmitindo dados do arquivo .
Commit da revisão 2.
Observe que, após a edição do arquivo, ao se executar o comando svn status, o mesmo retorna indicando que o index.php foi Modificado.
Quanto se executa o commit o arquivo Modificado é enviado para o repositório e o prrojeto fica na revisão 2.
6. Alterando a estrutura (diretórios e arquivos) do projeto.
/tmp/HelloWord# mkdir cpanel
/tmp/HelloWord# cd cpanel
/tmp/HelloWord/cpanel# echo “<?php echo ‘PainelDeControle’; ?>” > \
cpanel.php
/tmp/HelloWord/cpanel# cd ..
/tmp/HelloWord# svn status
? cpanel
Observe que o subversion mostra uma interrogação ao lado do diretório que acabamos de criar. Isso indica que este diretório ainda não é controlado pelo subversion, ou seja, ainda não está no repositório. Precisamos adicioná-lo ao repositório.
/tmp/HelloWord# svn add cpanel/
A cpanel
A cpanel/cpanel.php
Observe que ele automaticamente adiciona tudo que está dentro do diretório cpanel. Vale lembrar que, apesar do comando ter sido bem sucedido, o mesmo ainda não foi definitivamente concretizado. Para isso, precisamos chamar novamente o commit.
/tmp/HelloWord# svn commit -m “+ Diretorio cpanel”
Adicionando cpanel
Adicionando cpanel/cpanel.php
Transmitindo dados do arquivo .
Commit da revisão 3.
Veja que automaticamente todo o conteúdo do diretório foi enviado ao repositório e agora o nosso projeto se encontra na revisão 3.
vamos adicionar mais um arquivo no nosso cpanel e ver o que acontece.
/tmp/HelloWord# echo “<?php echo ‘moduloUsuario’; ?>” > \
cpanel/user.php
/tmp/HelloWord# svn status
? cpanel/user.php
Como esperado, o status retorna informando que o arquivo user.php ainda não está sobre controle do subversion. Logo vamos adicioná-lo.
/tmp/HelloWord# svn add cpanel/user.php
A cpanel/user.php
/tmp/HelloWord# svn commit -m “+ modulo usuario”
Adicionando cpanel/user.php
Transmitindo dados do arquivo .
Commit da revisão 4.
Agora nosso projeto se encontra na revisão 4. Acho que você já deve ter notado que a cada commit o número da revisão é incrementado. Deve ter notado também que a cada arquivo criado, deve-se adicioná-lo ao repositório correto ? Correto! E deve estar pensando na trabalheira que é, se eu adcionar um monte de arquivos ou se eu tiver que ficar dando add e commit a cada arquivo criado. Pois é ! Mas hoje já existem aplicativos, como o rapidSVN, o TortoiseSVN(para windows), scripts que se integram ao nautilus, etc, que fazem tudo isso na interface gráfica. Ou seja, o que estamso fazendo aqui, manualmente é para que você entenda o conceito, já que o modo de usar os softwares pode variar de um para outro.
Vamos imaginar agora que por um descuido você removeu o arquivo user.php, do diretório cpanel, quando era para ter removido outro.
/tmp/HelloWord# rm cpanel/user.php
/tmp/HelloWord# svn status
! cpanel/user.php
Observe que o subversion retorna com o nome do arquivo removido com uam exclamação, como quem diz : Meu Deus, cadê o arquivo que eu estava controlando ?! Como isso foi um engano, e como você anteriormente já tinha colocado este arquivo no repositório, você pode atualizar a sua cópia de trabalho com o comando updatde.
/tmp/HelloWord# svn update
Restaurado ‘cpanel/user.php’
Na revisão 4.
O arquivo foi restaurado. Começaram a perceber o poder deste negócio de controle de versão ?
Com isso fica o que falamos acima. Quando quiser realmente adicionar um diretório, remover um arquivo, criar um novo arquivo, você deve fazer isso com os comandos do subversion. Na verdade, adicionar arquivo e diretórios nem é tão crítico, já que podemos utilizar o comando add posteriormente a criação dos mesmos, mas a remoção de arquivos e diretórios ou mesmo a movimentação deles para outros lugares, isto sim, deve ser feito com o subversion. Logo a remoção do arquivo, se você quiser realmente removê-lo, deve ser feita da seguinte maneira :
/tmp/HelloWord# svn delete cpanel/user.php
D cpanel/user.php
/tmp/HelloWord# ls cpanel -lh
total 4,0K
-rw-r–r– 1 root root 34 2007-05-29 12:23 cpanel.php
/tmp/HelloWord# svn commit -m “- user.php”
Apagando cpanel/user.php
Commit da revisão 5.
E se, mesmo depois de ter apagado propositadamente, você descobre que aquele arquivo continha um trecho que você poderia necessitar ? Ou mesmo, que aquele arquivo era essencial e você não deveria ter apagado ? Será que tem como recuperar o arquivo ? Tem sim, claro. Basta você dizer para o subversion que quer que ele atualize a sua cópia de trabalho para a revisão anterior, no caso a 4.
/tmp/HelloWord# svn update -r4
A cpanel/user.php
Atualizado para revisão 4.
/tmp/HelloWord# ls cpanel -lh
total 8,0K
-rw-r–r– 1 root root 34 2007-05-29 12:23 cpanel.php
-rw-r–r– 1 root root 31 2007-05-29 12:59 user.php
Observe que agora estamos trabalhando da revisão 4. A revisão 5 ainda existe, só que ela não possui o arquivo user.php. O interessante é notar que, a qualquer momento, podemos trabalhar nas revisões que quisermos, nos movimentando entre os nossos “backups”. Só que isso gerou um impasse, concordam ? Eu tenho um arquivo , que acabei apagando de propósito, mas que não era para ter apagado, na revisão 4, mas não tenho ele na revisão 5. Se eu continuar a trabalhar na revisão 4, eu perco todas as outras alterações (se houverem), que eu tenha feito até o commit para a revisão 5. Se eu vou para a revisão 5, eu tenho todas as alterações, mas não tenho o arquivo user.php. E agora ? Quem poderá nos ajudar ? :D
A questão é que o subversion dá nó em pingo d’água. E o que estamos escrevendo aqui é apenas uma pontinha de todo o seu poder. Como tudo para o subversion é diretório e arquivo, pensemos assim. Se eu não utiliza-se controle de versão e fizesse as coisas na mão, provavelmente eu teria dois diretórios assim :
HelloWordRevisao4
HelloWordRevisao5
Logo, ficaria muito fácil eu recuperar o arquivo, fazendo uma simples cópia entre diretórios, concorda ? Então o mesmo se aplica ao subversion, ele tem um comando chamado copy, onde você pode especificar a origem, o destino e a revisão. Então observe:
Voltemos para a revisão 5.
/tmp/HelloWord# svn update
D cpanel/user.php
Atualizado para revisão 5./tmp/HelloWord# ls cpanel/ -lh
total 4,0K
-rw-r–r– 1 root root 34 2007-05-29 12:23 cpanel.php
Agora vamos copiar o arquivo user.php, que está na revisão 4, para a nossa cópia de trabalho atual.
/tmp/HelloWord# svn copy -r4 \
file:///tmp/repositorios/HelloWord/trunk/cpanel/user.php \
cpanel/A cpanel/user.php
/tmp/HelloWord# ls cpanel/ -lh
total 8,0K
-rw-r–r– 1 root root 34 2007-05-29 12:23 cpanel.php
-rw-r–r– 1 root root 31 2007-05-29 13:13 user.php/tmp/HelloWord# svn status
A + cpanel/user.php
Como podemos notar, o arquivo foi copiado do repositório para a pasta, e aparece com um A, indicando que foi adicionado a sua cópia de trabalho. Finalmente, vamos dar um commit para gravar tudo no repositório.
/tmp/HelloWord# svn commit -m “user.php recuperado”
Adicionando cpanel/user.php
Commit da revisão 6.
Imagine que chegamos ao final do dia e decidimos que esta versão final (revisão 6) deveria sser chamada de HelloWord Versao 1.0. Podemos decorar que a revisão 6, é a versão 1.0, ou podemos dar este nome específico para esta revisão. de modo que quando fizermos referência a versao 1.0 o subversion nos traga automaticamente a revisão 6. Este processo consiste em “TAGGEAR” o projeto. Este é o motivo, já explicado acima, de termos criado o diretório tags.
Este processo nada mais é do que uma cópia entre diretórios, utilizando o subversion.
Antes de mais nada, vamos listar quais são as tags (versões já lançadas, digamos assim), que nós temos. Ou seja, vamos dar um ls (comando dir, para o DOS), no repositório.
/tmp/HelloWord# svn list file:///tmp/repositorios/HelloWord/tags/
Observe que nada foi retornado, como esperado.
Para testar um pouco mais do comando list, vamos listar o trunk.
/tmp/HelloWord# svn list file:///tmp/repositorios/HelloWord/trunk/
cpanel/
index.php
Ele retornou com os nossos arquivos. Claro, porque estamos trabalhando sempre no trunk, lembram ? Ou seja, o comando list seria como um ls, láááá no repositório.
Mas vamos lançar nossa versão 1.0 do nosso incrível projeto Hello Word.
tmp/HelloWord# svn copy file:///tmp/repositorios/HelloWord/trunk/ \
file:///tmp/repositorios/HelloWord/tags/versao1.0 \
-m “Lancando a versao 1.0″Commit da revisão 7.
Antes de mais nada, o comando acima deve ser digitado em uma única linha. Pronto, nossa versão foi lançada. O que fizemos foi apenas copiar o que tinha no nosso Trunk para o diretório versao1.0 dentro de tags. Isso láááá no nosso repositório ok ? Ah, uma coisa. Isso não vai duplicar os milhares de arquivos que temos em nosso projeto, ele vai apenas criar links simbólicos, ok ? :D
Vamos listar agora, quais as tags (versôes) que nós temos.
/tmp/HelloWord# svn list file:///tmp/repositorios/HelloWord/tags/
versao1.0/
Pronto! Final do Dia. tudo correu bem. Lançamos uma versão e vamos para casa.
Agora imagine que você chegou em casa, e lembrou que esqueceu de coloca uma pequena coisa no index.php, e gostaria de trabalhar no seu projeto. Claro, que estamos trabalhando com um repositório local, mas como dito anteriormente, o mesmo pode estar em um servidor em qualquer lugar do mundo, ou mesmo, pode estar no seu pendrive. Vamos fazer de conta, que o repositório está acessível para a gente da mesma forma que estava na outra máquina, lá no trabalho ok ?
E agora, como eu faço para trabalhar no meu projeto ? Basta você voltar a fita e ir lááááá para o passo número 4, onde falamos em checkout. É isso mesmo. Como não temos uma Cópia de Trabalho, ainda, precisamos fazer um checkout, ou seja, copiar a revisão lá do repositório para um diretório qualquer. Então você pode fazer, imaginando que vamos trabalhar no diretório /home/diego/temp :
/home/diego/temp# mkdir HelloWord
/home/diego/temp# cd HelloWord/
/home/diego/temp/HelloWord# svn checkout \
file:///tmp/repositorios/HelloWord/trunk .A cpanel
A cpanel/user.php
A cpanel/cpanel.php
A index.php
Gerado cópia de trabalho para revisão 7.
Pronto, agora é só meter a mão na massa e continur com os commits, updates, etc etc etc.
Ah, como estamos trabalhando sozinhos, os updates não se tornam tão importantes. Mas se estivermos trabalhando em dupla de dois, por exemplo, vale a pena sempre dar update para garantir que sua cópia de trabalho esteja sempre atualizada, caso seu amigo tenha feito alguma modificação.
Espero que este pequeno grande artigo sirva para abrir os horizontes dos iniciantes no mundo do controle de versão.

91 Responses
Talles César
Maio 29th, 2007 at 3:11 pm
1Diego, meus parabens cara, simplesmente show. Ajuda muito no nosso dia dia mesmo. Isso aí!!!! Abraços
Gustavo Henrique
Maio 30th, 2007 at 12:09 am
2Parece até mentira… to querendo aprender mais sobre controle de versoes com o subversion, baixei algumas apostilas e ate livros completos e seu artigo consegue de forma simples e fácil me explicar mais do que varias paginas que li.
Obrigado!
Willie Moraes
Maio 30th, 2007 at 9:34 am
3Diego, toda vez que eu executo svn update ele atualiza meu diretório de trabalho sobrescrevendo tudo?
Se sim, isso é pq a idéia é sempre atualizar o repositório? E se eu atualizar antes de um commit já “Elvis” o que eu tinha acabado de fazer no diretório de trabalho?
Miguel
Maio 30th, 2007 at 10:27 am
4O update não sobrescreve nada que tu tenha alterado. Se mais alguem tiver editado o mesmo arquivo que tu, ele tenta fazer merge. Se nao conseguir, ele te pede pra resolver os conflitos.
FernandoBR
Maio 30th, 2007 at 10:40 am
5Cara, incrível mas eu tava falando sobre isso ontem e ia começar a buscar material hoje, valeu mesmo, vou começar estudando pelo seu tutorial, obrigado.
comentarista
Maio 30th, 2007 at 12:24 pm
6Subversion é mau. Só o Git é bom.
diego
Maio 30th, 2007 at 12:30 pm
7Pessoal, muito obrigado pelo apoio ao artigo. Isso é o que motiva a gente escrever.
Willie, como disse o Miguel, ele não sobrescreve não, ele tenta fazer um merge, como ele mesmo falou, ou seja, juntar o que você tem feito em um arquivo, com o que outra pessoa tem feito no mesmo arquivo.
Eu tinha esquecido de colocar dois links que acho legal para consulta sobre o assunto.
Um é um cheat sheet que dá um resumão dos principais comandos:
http://www.abbeyworkshop.com/howto/misc/svn01/
Outro é do livro Version Control with Subversion. Este é para quem quer se aprofundar mesmo.
http://svnbook.red-bean.com/en/1.2/index.html
É isso.. mais uma vez muito obrigado e continuem comentando e até atualizando com novas dicas. Quanto mais dicas, links, tivermos aqui, melhor, pois assim teremos um local que concentra tudo.
Abraços a todos.
Roger Demetrescu
Maio 30th, 2007 at 12:39 pm
8Parabéns Diego !!
Vou até imprimir o teu artigo para lê-lo com calma… mas apenas passando os olhos pelo que vc escreveu já deu pra ver que você abrangiu legal o SVN e com um estilo de escrita interessante (lembra o Aurélio do http://www.aurelio.net/)
Obrigado por essa colaboração !!
Roger
Diego
Maio 30th, 2007 at 12:40 pm
9Cara, realmente ficou muito bom, parabéns!
Como eu achei o texto muito bom, vou até divulgar :-)
diego
Maio 30th, 2007 at 12:51 pm
10Valeu pessoal, obrigado mesmo.
E tem até um xará ai comentando ! Valeu Diego! :D
Abraços
Kabloc
Maio 30th, 2007 at 5:18 pm
11Eu adorei este post esta de parabéns !!!!
Mas eu gostaria de poder ajudar a responder uma perguntinha…
“Qual a vantagem disso (no caso de um Pendrive) em relação a um servidor externo ?”
Um Pendrive não é muito seguro de você usar como BackUp é muito comum um PenDrive crachar*, então é sempre bom ter um BackUp do conteúdo do seu PenDrive.
Como um amigo meu que é desenvolvedor disse: eu não compraria um Pendrive de 1Gb, porque 1Gb é muita informação para perder…
Pense nisso…
*para de funcionar, quebrar, cair na agua, alguém roubar, você perder.
Júlio Santos Monteiro
Maio 30th, 2007 at 5:26 pm
12Controle de versão com Subversion…
O UltimoLOG publicou recentemente (ontem!) um excelente artigo sobre o sistema de controle de versão Subversion. O mais legal é que tudo foi feito em cima do Ubuntu Linux. Tudo muito bem escrito e voltado para quem nunca mexeu com controle de versõ…
diego
Maio 30th, 2007 at 5:38 pm
13Valeu pela dica Kabloc. Agora o mais interessante disso, que já leva a uma outra discussão, é esta questão da fragilidade dos Pen Drivers. Eu sempre pensei que eles eram muiiiito seguros, até porque não vi nenhum quebrar até hoje, até pela sua estrutura simples. Ainda cheguei a ver um tempo atrás um teste de memórias flash que o pessoal chegava a passar com um rolo compressor em cima, isso depois de jogar café, agua, etc, e os mesmo continuavam funcionando.
Mas é como você mesmo falou kabloc. Todo cuidado é pouco!
Valeu demais pela dica e comentário.
Jorge Campos
Junho 12th, 2007 at 11:01 am
14Meus parabéns Diego!!
Seu artigo está realmente sensacional, numa linguagem bem simples e descontraída. Depois de procurar em vários lugares descobri, aqui com seu artigo, o que realmente significam trunk, branch e tags de forma muito fácil e simples. Vou indicar a todos os que conheço que utilizam o subversion.
Muito Obrigado!
diego
Junho 12th, 2007 at 11:02 am
15Valeu Jorge! Obrigado a você pelo comentário.
Abraços
Diego
Eriksen Costa
Junho 13th, 2007 at 8:41 am
16Só podemos agradecer ao excelente post!
Obrigado!
fred
Julho 2nd, 2007 at 12:46 am
17cara… simplesmente show de bola
a linguagem utilizada foi o diferencial entre os outros artigos chatos que eu li…
Ri e aprendi muito.
Gostaria de saber do funcionamento dos BRANCHS.
Voce explicou trunk… working copy… tags… mas faltou o branchs…
No mais… obrigado pelas informaçoes…
valew ate +
Tulio Faria
Agosto 5th, 2007 at 11:03 am
18Parabéns pelo artigo… O linguajar utilizado é um diferencial e tanto, facilitando e muito o entendimento…
Vou até tentar iniciar o uso do SVN :)
André Duarte
Agosto 13th, 2007 at 3:27 pm
19Parabéns!! Artigo muito bem elaborado.
Luiz
Agosto 17th, 2007 at 2:24 pm
20Parabéns pelo artigo, Diego!
Quem quiser se aprofundar, tem um livro gratuito em inglês com 367 páginas:
http://svnbook.red-bean.com/
Jack Andrews Seven
Agosto 22nd, 2007 at 4:24 pm
21Cara, simplesmente o MELHOR TUTORIAL para quem está iniciando no SVN. Parabéns. Você tem uma didática espetacular.
tt
Agosto 23rd, 2007 at 11:39 pm
22mm
Diego Pires
Agosto 31st, 2007 at 2:20 pm
23Diego… Muito bom o artigo…
Para falar a verdade eu já tenho um svn configurado… Mas… toda vez que reinicio o servidor ele “some” com o repositório… Já passou por isso? Imagina o que pode ser?
Abraço e Obrigado
Daoram
Setembro 16th, 2007 at 7:59 pm
24Excelente artigo. Parabéns e continue nos oferecendo posts úteis e prazerosos de ler.
Abraços.
diego
Setembro 17th, 2007 at 10:26 am
25Pessoal,
primeiramente me desculpem pela demora em responder aos comentários, é que já faz alguns meses que ando numa correria só e agora, prestes a casar, a coisa piorou um pouco, mas depois eu volto com mais calma.
Diego Pires, cara, nunca vi tal coisa. Neste meio tempo, quase um mês depois, vc chegou a alguma conclusão ?
Fred, desculpa a demora, vc já chegou a entender o que são os branchs ? Se não fala ai que eu tento explicar melhor.
Valeu a todos que postaram..
Abraços
Diego
Marcus
Setembro 19th, 2007 at 6:26 pm
26Prezado Diego,
Parabens pelo execeleeeeente tutorial. nota dez.
Segui os passos do tutorial e foi tudo bem, estou usando o Eclipse com o plugin SubClipse no Windows. Create ok, import ok, checkout ok, alterei um arquivo, gravei e o commit foi ok, mas ao fazer o svn update (pelo Eclipse ou pelo DOS) recebo essa mensagem de erro.
svn: Directory ‘C:\Users\mveloso\workspace\guiace\bin\org\.svn’ containing working copy admin area is missing
usando o svn status recebo a informação abaixo:
~ bin\org
Agradeço antecipadamente sua ajuda.
Marcus
Marcus
Setembro 20th, 2007 at 3:33 pm
27Diego,
Ficou muito bom mesmo o tutorial. Obrigado por sua iniciativa.
Resolvi o problema que relatei usando o svn:ignore.
Marcus
Diego Pires
Outubro 9th, 2007 at 5:16 pm
28Então Chará…
Ainda não consegui resolver essa questão… Continua sumindo do HD o repositório toda vez que reinicio ele…
É difícil reiniciar esse servidor… Mas… quando precisa… É aquele trabalho para configurar tudo denovo!
Abraço
nilso
Outubro 31st, 2007 at 10:55 am
29Muito bom artigo, Diego. Ajuda bastante e com linguagem simples.
Implementamos o subversion em uma empresa multinacional … bem, meu gerente não gosta do Linux … não foi difícil convencê-lo da melhor solução: custo, tempo, abrangência.
Gostaria de colocar uma questão que desde já agradeço a resposta: como recuperar os meus códigos-fontes e versões em caso de desastre? É só instalar o Subversion e importar os arquivos do backup? Simples assim?
Obrigado,
Vagner Gomes
Novembro 9th, 2007 at 2:04 pm
30Muito bom,
Meus parabéns Diego pelo tutorial, pela didática nas explicações e escritas, excelente. Sinceramente pareceu que eu estivesse em uma sala de aula.
Li de cabo a rabo e consigui ter uma base do que é o SVN, considerando que sou um recruta em Linux.
Mas aqui vai uma dúvida Diego. É possível pelo SVN realizar scripts de logon (mapeamento de pastas) por grupos e/ou por usuários com suas devidas permissões? O SVN faz isso? Se sim, como?
Muito obrigado pela ajuda, e parabéns.
Abraços.
Richard Valdivia
Novembro 20th, 2007 at 9:39 am
31Sensacional seu artigo! Normalmente dou uma pincelada nos textos que encontro na Internet, mas com seu bom humor e didática li o mesmo na integra e já recomendei para outros usuários.
Parabéns!
Alberto
Novembro 20th, 2007 at 10:27 am
32Matou a pau brother.
Havia tentado SVN um tempo atrás, tipo, pisar na agua pra ver se o rio é fundo.
Hoje fui de kbça e ainda tô na dúvida se caiu a ficha ou morri afogado :D
Vlw. mto bom.
Excelente didática
diego
Novembro 20th, 2007 at 12:13 pm
33Pessoal, muito obrigado pelos elogios ao meu artigo. Fico feliz que tenham gostado. Desculpem a demora em responder mas estes últimos meses foi bem corrido. :) Casamento, Lua de Mel, despesas, etc etc etc… :D
Diego Pires, cara isso tá muito estranho. É um comportamento que nada tem a ver com o SVN. Onde vc está colocando o seu repositório ? Não seria em uma pasta que tem uma limpeza automática a cada reboot, como o /tmp do Ubuntu ?!
Nilso, o que vc fala é como recuperar o seu repositório ?! Tipo, o HD onde estava seu repositório pifou, mas vc tem uma cópia dele em algum outro lugar ? Seria isso ? Não entendi bem. Se sim, o processo mais simples seria re-copiar o repositório com a mesma estrutura anterior e continuar trabalhando. Por exemplo. Se o repositório estava dentro de /opt/repositórios, basta recriar estas pasta e colocar sua cópia lá. Se não for isso, explica ai melhor pra gente debater. :D
Vagner, não entendi bem o que vc quis perguntar. Acho que você está confundindo o SVN com o SAMBA não ?!
Valeu pessoal.
Vagner Gomes
Novembro 20th, 2007 at 3:15 pm
34Oi Diego, blz cara?
Então, não não, eu sei que o Samba ele faz todo a parte de PDC e entre outras aplicações como impressoras de rede e N funções, da mesma maneira que Windows Server. A minha dúvida é, o SVN consegue fazer logon de rede? Ou é somente uma ferramenta para versionamento de arquivos?
Estou te perguntando isso porque estão tentando me convercer que ele tb faz isso. Sinceramente, acho que não tem nada a ver uma coisa com a outra. Versionar arquivos é comparar um com o outro, executar um logon de rede, já se usa um conceito de .bat, é outra coisa. Estou certo?
Abraços Diego.
Vagner
Diego Albuquerque
Novembro 20th, 2007 at 3:55 pm
35Vagner, então cara, ou este pessoal descobriu uma nova maneira hackeada super secreta de usar o SVN, ou eu não entendi nada do que o SVN faz e por conseguinte você também e escrevi tudo errado, ou estamos ficando todos loucos! kkkkkkk…
Rapaz, como vc mesmo falou, SVN é para versionamento de arquivos, não tem nada a ver com Logon de Rede.
Abraços
Diego Pires
Novembro 23rd, 2007 at 8:30 am
36Fala Chará…
Então… me deixou intrigado agora… hehe Eu to usando o Red Hat e to colocando o repositorio em /dev
Será que é isso? hehe Vou fazer o teste colocando em outro lugar para ver…
Ah… outra coisa… Vou dando os commits da vida… tem como eu recuperar o arquivo de uma determinada versão? Tipo… to na revisao 129… quero ver a versao 110… tem como?
Abraço e valeu
Vagner Gomes
Novembro 23rd, 2007 at 10:45 am
37Fala Diego.. blz?
hahaha foi o que imaginei, esse amigo meu tá ficando louco mesmo!! Bom, já montei a estrutura de logon, e está funcionando perfeitamente.
pergunta Diego, as bastas branches, trunk e tags, devem ser criadas no mesmo local de instalação do subversion, ou nada a ver também?..rs
Abraços cara.
Vagner
Diego Albuquerque
Novembro 23rd, 2007 at 11:53 am
38E ae Diego. Rapaz, quase certeza ser isso mesmo. Acho que o /dev é recriado a cada boot, mas teria qeu confirmar. Bem, de qualquer forma, não ach ouma boa prática você colocar nada dentro do /dev que não se trate de um dispositivo. Muda de local.
Claaaaauro que tem, afinal é pra isso que ele serve ! :D :D Como ?! Dá uma olhadinha ai em cima, no artigo, onde mostro o exemplo prático. Você vai ver que em determinado momento uso o comando svn update -r4, para recuperar um arquivo na revisão 4.
Qualquer coisa, só falar. Melhor, digitar ;D
Abraços
Diego Albuquerque
Novembro 23rd, 2007 at 11:55 am
39Faaaala Vagner, beleza cara. Realmente este seu amigo é louco! kkkkkkkkk… Mas tem, quando as pastas serem criadas no mesmo local de instalação do subversion, não precisa não cara. Lembre-se que são apenas pastas, ou seja, você pode criar em qualquer lugar. Claro, dentro do seu repositório. OU seja, você pode colocar seu repositório em qualquer canto (svnadmin create ), e as pastas dentro dele ok ?
abraços
Carlos Eduardo
Novembro 23rd, 2007 at 1:02 pm
40Parabéns, belíssimo tutorial.
Vagner Gomes
Novembro 27th, 2007 at 11:03 am
41E aí Diego, blz?
Obrigado cara pelas dicas cara. Estarei sempre de olho aqui no ultimolog para saber de dicas e notícias. Mais uma vez parabéns pelas instruções ok.
Abraços,
Vagner
Árton
Novembro 28th, 2007 at 8:07 pm
42Muito bom este artigo! Na minha humilde opinião, reúne teoria e prática na media certa ;-). Agora fiquei com uma dúvida. Durante a primeira importação:
$svn import . file:///home/diego/repositorio/sitePessoal/trunk/
Os arquivos não deveriam ser importados para a pasta sitePessoal? Assim:
$svn import . file:///home/diego/repositorio/sitePessoal/
Porque do 1º modo ficaríamos com 2 pastas trunk!
Abraços!
Alan
Novembro 28th, 2007 at 8:11 pm
43Excelente artigo Diego! mas tenho dúvidas quantos ao desenvolvimento web:
- Qual a melhor maneira de se trabalhar de se trabalhar com páginas web? toda vez que fizer alguma alteração terei de jogar todos os arquivos no servidor web? a workcopy deverá ser na pasta do servidor?
Diego Albuquerque
Dezembro 3rd, 2007 at 9:43 am
44Árton, valeu, mas vamos lá.
Primeira coisa que gostaria de deixar claro é que esta questão de pasta trunk, branch, etc, é apenas uma convenção ok ? você só usa se quiser.
A questão da importação inicial que você fala, é depois de criada a estrutura, ou seja, as pastas : trunk, branch, etc ?! Pq veja, o que eu faço é :
1 - Criar o repositório
Neste ponto, o repositório é apenas uma pasta vazia em algum lugar ok ?
2 - Criar uma pasta que, seria a minha pasta de trabalho, e ai dentro dela, criar as três pastas trunk, branchs e tags. Veja que faço isso por convenção, poderia não fazer e estaria tudo bem. :D
3 - Depois de criada as pastas, NORMALMENTE COM COMANDOS DO SISTEMA, ou seja, ai não entra nada de SVN, o que faço é importá-las para o repositório. Ai sim, mando elas para a PASTA DO REPOSITÓRIO, que criei no item 1, ou seja, file:///…/sitePessoal/
O que isso faz, como já falei, é uma simples cópia das pastas para o seu repositório, como se vc tivesse dado um CTRL+C e um CTRL+V, certo ? Importação = cópia do que está na sua pasta local para o repositório.
4 - Depois disso, apago tudo da minha pasta local. Porque isso ? Porque esta pasta, apesar de você ter usado o svn para fazer uma importação para o repositório, ela ainda não é versionada, ou seja, não é controlada pelo subversion. OU seja, vou apagar todos os diretórios que criei e vou ficar com a pasta limpinha de novo.
5 - Em seguida, o que faço é um Checkout, do repositório para a minah pasta local. O checkout nada mais é do que uma cópia inversa do import. Ele cópia tudo que tiver no repositório para a sua pasta local. NESTE PONTO, o que faço é um checkout da pasta trunk, que está dentro do repositório, ou seja: file:///…/sitePessoal/trunk , ok ?! O que ele deve trazer ?!?!?! NNAAAAADAAA! Claro, pq ainda não tem nada lá. Este simples fato, serve apenas para indicar ao subversion que, a partir de agora, que o que tem ali deve ser versionado, controlado, ok ?
6 - Ai dentro da minha pasta local, crio os arquivos que eu quero, as pastas, dou um ADD em tudo, para dizer que tudo ali deve ser versionado, e no final o que faço ?! Faço um COMMIT para enviar tudo para o repositório. MAS ONDE ISSO VAI PARAR ? Vai parar na pasta TRUNK. Porque ? Porque no checkout vc disse que esta pasta deveria estar sincronizada, versionada, com a pasta trunk, entendeu ?!
Ou seja, na verdade, tudo se trata de cópias de uma pasta para outra, onde vc vai colocar, pouco importa, vc que define. Esta questão de trunk, ou não é apenas uma convenção, entende ?
Acho que você ficou um pouco confuso, pois acho que em um exemplo, falo de uma importação inicial para a pasta trunk e em outra para a pasta do repositório diretamente né ? Mas veja que são contextos diferentes. Uma hora eu tou criando toda a estrutura dando uma importação inicial na estrutura e só depois mandar os arquivos e em outra, já faço diferente.
Mas bem, espero que isso esclareça um pouco para você.
Abraços, Diego.
Diego Albuquerque
Dezembro 3rd, 2007 at 9:44 am
45Alan,
Quanto a qual a melhor forma de se trabalhar com páginas web, esta é uma excelente questão que , admito, nem eu sei bem ao certo. Vou dizer o que faço hoje, apesar de ainda achar que não é a melhor opção e vou dizer o que para mim seria melhor.
Hoje eu faço o seguinte. Tenho um repositório no meu pendrive. Já respondendo a sua última pergunta sobre a workcopy: A workcopy é uma cópia de trabalho que vc deve ter no seu computador local. E é isso que eu tenho. Como eu trabalho com meus projetos tanto no meu notebook, como em um computador no trabalho, eu tenho duas workcopies, uma em cada micro. E como faço ? Bem, como eu coloco o meu repositório no pendrive, todo dia, ou quando vou trabalhar nos projetos, coloco o meu pendrive no micro, vou na minha pasta de trabalho (workcopy) e dou um update. Com isso, eu trago do repositório quaisquer mudanças que eu tenha feito. No decorrer do dia, vou fazendo as alterações e a cada alteração mais importante, ou que ache relevante, eu faço um commit, para que elas fiquem no repositório. Ao Final do dia, removo o pendrive e pronto.
Ao chegar em outro micro, no caso meu note, o que eu faço é repetir o processo. Como sempre dou um update antes de começar a trabalhar para sincronizar com meu repositório, fico sempre com minha workcopy atualizada, independente da máquina onda esteja trabalhando.
Veja, que decidi colocar meu repositório em um pendrive, mas poderia ser em um servidor web, entende ?! A questão do pendrive é que posso trabalhar mesmo sem conexão.
Ai vem a questão. E como fazer para colocar isso no servidor web. Bem, veja que tudo que falei até agora, foi para o meu desenvolvimento local, já que só vou colocar “no ar” o que foi devidamente testado, claro.
Hoje, o que faço é apenas fazer upload dos arquivos que alterei. Meu controle, por enquanto, sobre isso é meio manual. Anoto o nome do arquivo que altero para depois fazer o FTP. Claro que poderia ver pelos logs no SVN.
Agora, a melhor maneira ao meu ver, é você usar, se vc estiver no windows, ou via wine, o gerenciador de arquivos do Dreamweaver, pois ele permite vc sincronizar uma pasta local com uma pasta remota, detectando o que foi modificado e só reenviando os arquivos necessários.
Já procurei algum programa que faça isso, mas ainda não encontrei, e por isso penso em desenvolver um, mas ainda não tive tempo.
Bem, acho que é isso, qualquer coisa, pode perguntar.
Abraços,
Diego
Rafael Carneiro » Blog Archive » Quer aprender Subversion?
Dezembro 4th, 2007 at 11:27 pm
46[…] http://www.ultimolog.com/2007/05/29/controle-de-versao-com-subversion- svn-rapido-e-pratico/ […]
» SVN: por quê é importante manter o controle do desenvolvimento - Blog de Kan Ishigami
Fevereiro 3rd, 2008 at 6:37 pm
47[…] dias procurando alguns artigos para aprender mais sobre SVN, encontrei um artigo bem escrito para quem quer se aventurar pela primeira vez no universo do controle de […]
Silva
Fevereiro 24th, 2008 at 3:57 pm
48Excelente artigo,nota 10
Carlo Pires
Março 1st, 2008 at 5:13 pm
49Cara, são pessoas como vc que fazem a diferença da web. Que bom q vc tirou um tempo para fazer e publicar esse excelente tutorial.
Me salvou o dia. Parabéns!
Vagner Gomes
Março 5th, 2008 at 2:36 pm
50Fala Diego, como tá cara? Tudo beleza? Faz tempo hein!! Curtindo o casamento??..hehe.. é bom é bom.. pretendo um dia tb…
Diego seguinte, uma dúvida! Como eu faço pra configurar o serviço do svn, para quando o servidor for reinicializado, o serviço subir sozinho? Muito complicado de explicar isso? Se for desencana!!
Abraços cara.
Vagner
Diego Albuquerque
Março 6th, 2008 at 12:10 pm
51E ae Vagner, beleza cara ? Curtindo com certeza… :D :D
Bicho, faltou você só me dizer se isso é no Ubuntu, no windows, onde é ?!
No ubuntu, vc tentou : aptitude install subvsersion ?
Abraços
Diego
Rodrigo(loks)
Março 13th, 2008 at 3:55 pm
52Diego,
Comecei um estagio hotem e jah estava quase ficando loucooooo de tanto procurar alguma coisa UTILL sobre o subversion…ate que enfim!!!!MUITO MUITO MUITO BOM seu tutorial.
E pela primeira vez li sobre uma coisa que n SABIA absolutamente nda e n fiquei quase caindo da cadeira de sono …ainda n tenho duvidas…ate pq nem passei perto do “GAROTO” hehe…
MUITISSIMO OBRIGADOOO!!
abraco…
Vagner Gomes
Março 13th, 2008 at 4:27 pm
53Fala Diego… desculpa a demora cara… correria total…
Então, é no Fedora 7 mesmo. Na verdade criei um arquivo dentro do xinet.d, mas até agora não dei um boot na máquina pra ver se deu certo…rs… O parâmetro foi esse:
service svn
{
socket_type = stream
wait = no
user = svn
group = svn
#umask = 002
protocol = tcp
port = 3690
server = /usr/bin/svnserve
server_args = -i
disable = no
}
Vou testar ainda…..
Aahh, já instalei o svn criei os repositórios, e aprendi a gerenciá-lo por acesso em grupos (rw e r), além de por usuário e por pastas também cara… Nem dormi de tão feliz que fiquei…hehe..
Mas agora o desafio é outro Diego, esse vou bater cabeça mais ainda.
Preciso configurar o svn para ser acessado pelo Apache (httpd).. eeta lasquera……. Cara, só pra vc saber, eu sempre fui 100% Microsoft e tem só 6 meses que to aprendendo a mexer com Linux, que por sinal gostando muito…rs.. Bom…
Os tutoriais que encontro na web, são bons, tudo bem… mas é que tem pontos que fica a dúvida no ar, já com o seu foi bem diferente…
Bom, vamos a luta, vou conseguir configurar esse trem, vc vai ver!! E te falo depois…
Vc tem algum tutorial de acesso SVN pelo apache?? Se tiver, nem preciso dizer que sou grato pacás né!!
Abração cara, se cuida!!
Vagner
Célio
Março 14th, 2008 at 5:18 pm
54Olá Diego!
Se você me permitir, gostaria de divulgar aqui o projeto de tradução do livro oficial do Subversion para Português Brasileiro. Iniciamos a tradução da versão 1.4 do livro recentemente, e já contamos com diversos tradutores voluntários. O grupo de tradução estará sempre aberto para receber novos tradutores. Se você é usuário do Subversion e deseja contribuir ajudando na tradução e revisão do livro oficial, acesse http://code.google.com/p/svnbook-pt-br/ para obter maiores informações.
Abraços!
Célio
Junior Pisetta
Março 23rd, 2008 at 8:07 pm
55Parabéns pelo bom guia que você escreveu.
Bruno Dulcetti
Março 28th, 2008 at 10:41 am
56Muito interessante Diego. Meio grande, mas ficou muito bom. Dicas e detalhes que ajudam e muito em projetos, principalmente os maiores e mais complexos e que tenha uma equipe mais extensa.
Recomande algum SVN, Tourtoise da vida para Mac? Que seja legal e bom? Porque vi alguns que não são muito bons e cheio de bugs.
Abraços.
Krix Apolinário » Blog Archive » Subversion
Maio 4th, 2008 at 1:17 am
57[…] um post no Blog ÚltimoLog que tem uma excelênte explicação sobre o SVN vale a pena da uma […]
Sidon
Junho 8th, 2008 at 4:43 pm
58Excelente artigo!
Tenho um artigo para preguiçosos de como instalar e utilizar um servidor svn no windows, qem sabe de alguma forma pode complementar este seu :-D Link:
http://www.cosmoverbal.net/?cat=8
Renato Pinheiro
Junho 24th, 2008 at 4:25 pm
59Muito bom o artigo e, é claro, fomentou dúvidas :)
Se eu quiser zerar meu repositório, ou seja, voltar ao momento onde não existiam versões, é possível?
Tenho um projeto no sf.net e, aprendendo a trabalhar com o SVN, subi um monte de coisas, apaguei, movi etc. Queria voltar ao ponto onde nada existia para então começar mais organizado, mas não achei nenhum comando para isso.
Breno
Junho 27th, 2008 at 9:27 pm
60Ótimo artigo, Diego. Muito bem explicado e muito agradável de ler. Para quem já conhece, seu estilo lembra bastante o da série de livros Use a Cabeça (Head First).
Continue assim.
Parabéns!!!
Rodrigo Xavier
Junho 29th, 2008 at 11:56 pm
61Eu sei que o subversion trabalha com a politica otimista, duas pessoas trabalhando em um mesmo arquivo, mas eu gostaria de altera-lo para pessimista, onde apenas um desenvolvedor poderá alterar um arquivo.
gostaria de saber como que eu faço essa mudança.
ótimo artigo :D
Fernando
Julho 1st, 2008 at 5:42 pm
62Diego, parabéns, realmente muito bom…
Fiquei apenas com uma dúvida acho que quanto às “boas práticas” dos branchs e tags…
Exemplo, estou com meu projeto no trunk, daqui a 2 meses preciso lançar uma versão específica, que obviamente ainda não está finalizada… devo fazer um branch para esta versão e quando finalizá-la, ai sim fazer um tag dela?
Eu entendi que é tudo diretório, arquivo e links mesmo, como eu já esperava… mas na prática não sei entendi a recomendação de separar branchs e tags…
a) Seriam o branchs onde quero trabalhar em paralelo e os tags realmente recomendados para se “nomear” as versões? (porque não percebi diferença entre um e outro)
b) Em ambos os casos, é só utilizar o svn copy, certo?
c) Pensando no exemplo que dei, eu deveria então fazer um copy para o branchs/ com o nome da versão que quero lançar, por exemplo, branchs/versão1.5 e ao terminar de trabalhar neste branch, fazer outro copy do branchs/versão1.5 para /tags/versão1.5 ??
Valeu!
Fernando
Julho 1st, 2008 at 6:38 pm
63Oi Diego,
Se me permite, acho que este link que achei responde minhas perguntas…
http://www.pushok.com/help/svnscc/index.php?redirect=adv_tagsbranches. htm
O que o autor dele diz é que, como eu imaginei, a recomendação é mesmo a de utilizar o tags/ somente para dar nome a uma versão, ou seja, nunca fazer commits para ela. Caso necessário, recomenda-se fazer um branch e fazer commits somente nos branchs. Certo?
Resolvi postar aqui nos comments pois pode ser dúvida de mais alguém por ai =)
Mais uma vez, parabéns pelo artigo!
Rodrigo Xavier
Julho 2nd, 2008 at 10:01 pm
64Eu sei que o subversion trabalha com a politica otimista, duas pessoas trabalhando em um mesmo arquivo, mas eu gostaria de altera-lo para pessimista, onde apenas um desenvolvedor poderá alterar um arquivo.
gostaria de saber como que eu faço essa mudança ?
Por favor me ajude
Diego Albuquerque
Julho 2nd, 2008 at 10:28 pm
65Pessoal,
deculpem a demora em responder, mas é que só hoje consegui um tempo. Bem vamos lá. Um por vez! hehehheheeh
@SIDON : Obrigado pela complementação do artigo cara.
@RENATO: Renato, se fosse local ia aconselhar a vocÊ apagar tudo e começar de novo. Como é no SF, não creio que exista uma maneira, pois ele parte do princípio que tudo que você fizer deve ficar guardado no histórico. Assim eu acho, já que nunca cheguei a hospedar nada no SF. Ao meu ver você poderia ou criar uma nova conta e ai começar pra valer ou então, admitir que a partir daquela versão é o começo de tudo e ai atribuir por exemplo uma TAG para não se perder.
@BRENO: EU conheco a série Head First. Pôxa uma comparação destas é mais que um elogio. Obrigado camarada.
@RODRIGO: Cara desculpa não poder te ajudar neste caso. A questão é que nunca cheguei a usá-lo com duas pessoas já que utilizo apenas para meus projetos pessoais. Apesar de talvez não parecer, este é um artigo meio de leigo pra leigo. Mas posso procurar para você e colocar aqui ok ? Amanhã vou falar com um amigo que trabalha bem com o svn.
@FERNANDO: Desculpa a demora em responder. Acabou que você mesmo achou a solução. Certíssimo cara, é isso mesmo. Obrigado pela contribuição.
Bem pessoal, acho que respondi a todo mundo. Muito obrigado pelos comentários.
Felipe Carvalho
Julho 18th, 2008 at 4:33 pm
66Muito bom toda a tua explicação, nota-se a atenção em demasia depositada nesta pequena explicação.
Belo trabalho!!!
DUCARALHO
Julho 25th, 2008 at 12:01 pm
67alert(”DUCARALHO O TUTORIAL”)
Silas
Julho 30th, 2008 at 4:41 pm
68Diego, parabens pelo tutorial já deu pra dar uma arejada nas idéias!!!
FReNeTiC
Agosto 11th, 2008 at 12:02 am
69cara
tava querendo aprender a mecher no svn para começar um projeto na empresa q eu to estagiando.
este seu artigo resolveu tudo!
muito obrigado!
parabéns pelo artigo, ele está excelente!
willians
Agosto 19th, 2008 at 5:47 pm
70Parabens pela iniciativa
Felipe Regalgo
Agosto 27th, 2008 at 4:33 pm
71Parabéns pelo artig!!! muito bom!!!!!!
Daniel Ribeiro
Setembro 2nd, 2008 at 3:19 pm
72Excelente artigo, já recebeu vários elogios aí, mas tu mereceu!
PARABÉNS e obrigado!
Klaus
Setembro 18th, 2008 at 1:59 pm
73Cara! Finalmente! Vc me fez entender como funciona o Subversion (acredite… é todo mérito seu)… parabéns por “descomplicar” isso… vai facilitar muiiiiiiiiiitooo a minha vida!
Bruno Maia
Outubro 5th, 2008 at 10:08 pm
74Uau, belo artigo. Didática e qualidade excelentes.
Parabéns pela contribuição de qualidade para a comunidade.
Marcus Vinicius
Outubro 17th, 2008 at 5:12 pm
75Diego, meus parabéns pelo artigo e muito obrigado. Você conseguiu apresentar de forma suscinta porém concisa exatamente as minhas dúvidas a respeito deste processo de versionamento do subversion. É como se você tivesse lido a minha mente e para completar explicado com uma excelente didática e uma visão de prática bem conveniente!
Parabéns novamente pelo artigo e muito obrigado pela ajuda!
Gedean
Outubro 17th, 2008 at 10:06 pm
76Desmistificou muita coisa de forma simples, parabéns, continue assim.
Abraço.
little_oak
Novembro 25th, 2008 at 1:55 am
77Simplesmente um how to de verdadeira importância, tudo funciona!
Abraços e continue assim.
Lucas Klassmann
Janeiro 2nd, 2009 at 1:55 pm
78Parabéns, o tutorial é ótimo, estou colocando um projeto no Google Code Host e não sabia trabalhar com SVN, apenas com Source Safe, estava há um tempo querendo aprender SVN.
Meus parabéns novamente.
Abraços.
Fabio Gameleira
Março 29th, 2009 at 10:42 am
79Diego,
Realmente este seu artigo é nota 10. Extremamente esclarecedor.
Utilizo e CVS e vinha tentando entender os conceitos do SVN, mas a maioria dos artigos encontrados complica mais do que ajuda.
Obrigado por compartilhar esta sua preciosidade, como você mesmo entitula “Rápido e Prático”.
Parabéns.
Daniel Correa
Abril 28th, 2009 at 10:32 am
80Todo mundo ja elogiou mas vou elogiar de novo.
Finalmente um tutorial esclarecedor sobre o svn.
Parabens, nota 10!
Daniel
Luciano
Maio 2nd, 2009 at 11:50 am
81Ótimo artigo!
Demais!
Sln
Maio 3rd, 2009 at 2:10 am
82Não funcionou comigo. Estou usando ArchLinux, o artigo é um confuso em algumas partes importantes e passa batido em outras. Tive que corrigir alguns erros que apareceram aqui não citados no artigo. O artigo não explica como fazer caso já tenha o código. Eu sou o checkout mas ele cria uma pasta trunk e dentro coloca tudo trunk, tags e branches e não explicou esse lixo gerado pelo svn.
Estou a umas 3 horas procurando um bom tutorial pra SVN, mas como sempre no mundo linux é mais facil complicar do que facilitar. Vou deixar pra próxima.
Abraços.
Sln
Maio 3rd, 2009 at 2:18 am
83Cara só pra você ter uma idéia to a 4 horas tentando aprender esse lixo de svn pqp linux é pra foder a vida mesmo, e eu em pensar que nesses 3 anos de uso eu fosse ainda defender.
May Gouveia
Junho 2nd, 2009 at 3:59 pm
84Muito bom, muito bom mesmo, está de parabéns pela iniciativa.
Me ajudou bastante, e a outros também.
May Gouveia
Junho 2nd, 2009 at 4:04 pm
85O ignorante critica o que não conhece, o sensato elogia quando tenta aprender, mas só o sábio ensina de forma simples e clara aos sensatos.
Windows é para todos, mas Linux é para poucos.
Como diz o matuto:
QUEM NÃO AGUENTA BEBE ÁGUA!
Tiago Moura
Julho 11th, 2009 at 3:42 pm
86Muitooo bom, parabéns.
Conseguiu resumir num artigo páginas e páginas de livros chatos ;P
Bom trabalho.
Samurai
Julho 20th, 2009 at 3:39 pm
87“Vai me dizer que você nunca pegou um arquivo fonte para alterar aquela função vital e só por via das dúvidas fez um backup e deixou lá : arquivoFonte.bkp. Ai depois precisou fazer outra alteração, e lá foi você fazer um outro backup : arquivoFonte-20070507.bkp ?! Ou ainda resolveu fazer uma alteração substancial em várias partes do site e ai resolveu, por via das dúvidas, copiar todo o diretório e criar um outro: projetoBackup !”
KKKKK demais!
beto
Outubro 5th, 2009 at 10:12 pm
88Diego meu filho tu é um santo…
tava precisando de aprender o que era Subversion, não tinha idéia de como funcionava, li um monte de artigo, baixei livro e nada… em 20 minutos olhando esse artigo peguei a manhã, vou imprimir também, vou postar no meu blog amanhã(com as devidas referências), vou guardar na cabeceira da minha cama…
Didática exelente e muito prático o artigo
parabéns pela obra prima!
Nicholas Pufal
Novembro 5th, 2009 at 7:37 pm
89Rapaz, o pessoal acima já disse tudo. Desde 2007 que pelo visto tu tá bombando com esse artigo hein! hheheh Mas vale a pena ver e rever mesmo… Tá muito bom.
Fiz um resumão aqui com as tuas dicas e informações.
Eu adoro informação gringa, pois as vezes tem muito mais coisas sobre um assunto escritas em inglês. Mas teu resumão da de 10 a 0 em tudo que já vi aí fora.
Valeu e parabéns!
Willie
Janeiro 27th, 2010 at 8:34 am
90Um tutorial sobre a utilização do SVN sempre é bom, mas preciso de um explicando a configuração do servidor.
O SVN vem por padrão no modo Merge. Preciso configurar meu servidor para o modo lock e não acho na net algo que explique isso.
Se alguém puder ajudar agradeço.
segue e-mail: w.meier88@hotmail.com
Bruno Santos
Fevereiro 25th, 2010 at 3:47 pm
91O melhor do SVN para iniciantes que existe na WEB ! Muito didático e objetivo !
RSS feed for comments on this post · TrackBack URI
Leave a reply
Significado: Guardar algo para futura consulta. Muito utilizado na informática para arquivar acessos a informações ou serviços para futuras auditorias. Logo, quando dá alguma m*#$%& , o administrador do site vira pro lado, pensa Fu#$*@ e vai logo consultar os últimos logs para ver o que foi que houve.
O ÚltimoLOG surgiu desta idéia de guardar tudo. Os últimos lampejos de criatividade, as últimas idéias, as mais recentes descobertas, ou seja, tudo que for legal para uma futura consulta e o mais importante, tudo em prol de compartilhar o conhecimento. Espero que gostem. ;D
Assine e Acompanhe!
Assine e receba todas as atualizaçõesou Receba por email:
Categorias
Arquivos
Links
Meta
Calendário
Artigos Recentes
Últimos Comentários
Mais comentados
ÚltimoLOG is proudly powered by WordPress - BloggingPro theme by: Design Disease