You are on page 1of 14

Manual de Utilizao de Subversion

Fbio Silva 2010

ndice
Subversion ................................................................................................................................3 Instalao ................................................................................................................................. 4 Utilizao em Linha de Comandos .............................................................................................5 1. Criao do repositrio .......................................................................................................5 2. Criao da pasta de trabalho .............................................................................................6 2.1 Checkout .........................................................................................................................6 3. Criar/Adicionar ficheiros e Commit ....................................................................................8 4. Update (actualizao da pasta de trabalho) .......................................................................9 4.1 Resoluo de Conflictos ................................................................................................... 9 5. Revert (reverter para o ficheiro original).......................................................................... 12 6. Apagar, mover ou copiar ficheiros ................................................................................... 12 7. Update para reviso antiga.............................................................................................. 14

Subversion
Estou a fazer este documento para vos explicar mais ou menos como funciona o Subversion e como que nos podemos organizar para trabalhar. O Subversion um programa para o controlo de verses e til tanto para trabalhos de grupo, como para trabalhos a solo. Para trabalhos de grupo, podemos trabalhar ao mesmo tempo, dividindo trabalho e ter a certeza que trabalhamos sempre com os ficheiros mais actuais. Se o elemento A estiver a trabalhar no ficheiro1 e o elemento B estiver a mexer no ficheiro2 (e houver dependncia entre os dois ficheiros, como no caso de vrias classes numa aplicao Java), ento o A pode ter a certeza que ir ter sempre o trabalho mais actual que o B est a fazer. Se por acaso dois utilizadores estiverem a mexer no mesmo ficheiro de forma distinta e os dois decidirem gravar o seu trabalho no repositrio (commit), ir haver um conflito entre as duas verses. O subversion permite ver as alteraes entre os dois ficheiros e decidir com que ficheiro vamos ficar, ou melhor ainda, com que pedaos do documento que vamos ficar (no fundo pode-se gerar um terceiro ficheiro com bocados do ficheiro1 e ficheiro2). Ainda em trabalho em grupo, muito mais fcil partilhar os documentos uns com os outros, sem ser necessrio estar a pegar nos ficheiros todos, meter num ZIP, enviar por mail ou passar por pen e depois o outro colega ter de Unzippar tudo para uma nova pasta e ver o que que lhe interessa passar ou no, correndo o risco de juntar mal o cdigo do trabalho do colega com o dele. Para trabalhar a solo, tambm til para ir mantendo um backup do trabalho j feito. Muitas vezes chegamos a um determinado ponto do trabalho em que nos apercebemos que afinal o que fizmos 2 ou 3 dias atrs at estava correcto e que agora fomos pelo caminho errado. Sem Subversion no d para voltar a esse trabalho anterior. Com o Subversion basta fazer um revert para uma reviso anterior e temos de volta o nosso trabalho antigo (e at podemos manter parte do trabalho que temos actualmente).

Instalao
O Subversion est disponvel em linha de comandos (e tal como o Linux, tem vrias distribuies diferentes) e tambm est disponvel em aplicao com interface grfica. A distribuio Slik, em linha de comandos est disponvel aqui: http://www.sliksvn.com/en/download (verso Slik Subversion) Outras distribuies esto na pgina do Subversion (Apache): http://subversion.apache.org/packages.html Para instalar a verso GUI (muito mais fcil de mexer e integra-se no ambiente do Windows), h o Tortoise: http://tortoisesvn.net/downloads

Utilizao em Linha de Comandos


Para se usar o Subversion em linha de comandos (como nos PCs da Faculdade), faam o seguinte:

1. Criao do repositrio
Primeiro temos de criar um repositrio. O repositrio mais ou menos uma base de dados e l que iremos guardar todos os nossos projectos, com todas as suas revises (iteraes). O repositrio pode manter todos os nossos projectos e para nossa organizao, convm criar subpastas para cada projecto, ou ento podemos criar um repositrio para cada projecto, para dividir completamente os trabalhos. Isto j depende do gosto de cada um. A criao do repositrio s vai ser feita uma vez e a partir da s precisamos de saber o caminho para o repositrio e mais nada. Para o criarmos usamos o svnadmin que o comando de administrao de subversion: svnadmin create <caminho-para-repositrio> Exemplo: imaginem que querem criar a pasta Repositorio e j esto nessa pasta C:\Repositorio (Windows) ou ~/Repositorio (Linux). Podem ento usar os comandos svnadmin create C:\Repositorio (Windows), svnadmin create ~/Repositorio (Linux), ou svnadmin create . (uma vez que o . (ponto) denomina a pasta onde nos encontramos). Depois de fazerem isto, o repositrio criado e no convm mexer mais nesta pasta directamente. Se o fizerem podem corromper o repositrio. Apesar dos ficheiros dos nossos projectos virem aqui parar, no podemos aceder-lhes directamente. A partir daqui todas as alteraes necessrias sero feitas com o comando svn.

2. Criao da pasta de trabalho


Depois do repositrio estar criado, vamos criar uma pasta para trabalhar (a pasta do nosso projecto). Podemos criar uma pasta chamada projecto no nosso Desktop, que ir ficar no caminho C:\Users\Nome\Desktop\projecto (Windows) ~/Desktop/projecto (Linux) (a partir daqui vou usar sempre exemplos para Windowspara Linux s muda mesmo o caminho para as pastas, mas isso bvio).

2.1 Checkout
Depois de criada a pasta, entramos para essa pasta e l que iremos fazer checkout: svn checkout <URL-para-repositrio> <pasta-de-trabalho> Em vez de checkout, podemos abreviar para co). Ateno que temos URL-para-repositrio e no caminho-para-repositrio. Isto tem a ver com o facto de agora o comando svn necessitar de um caminho em forma de URL para o nosso repositrio e portanto utilizar o formato de pastas especfico de cada sistema operativo, no ir funcionar. Para repositrios locais (no nosso computador) utiliza-se o protocolo para ficheiros locais: file://<caminho> Para repositrios em web-servers utiliza-se http://<server>:<porta> Tambm se pode usar o protocolo svn://, especfico para Subversion, mas isso agora no interessa! Exemplo (usando o repositrio e pasta de trabalho j criadas nos outros pontos): svn co file:///Repositorio C:\Users\Nome\Desktop\projecto, ou svn co file:///Repositorio . (se j estivermos na pasta de trabalho) ATENO: Pastas com nomes separados no funcionam bem!! C:\Users\Fbio Silva\Desktop\projecto no ir funcionar por causa do espao no nome. Mais vale ir primeiro para a pasta e depois usar o ponto . para se referirem pasta actual. A pasta do repositrio encontra-se em C:\Repositorio, portanto como no podemos simplesmente escrever file://C:\Repositorio (sintaxe incorrecta), temos de alterar para file:///Repositorio. Isto corresponde a indicar a raz (/) e a sua sub-pasta Repositorio.

Se o repositrio estivesse por exemplo em C:\Users\NomeUtilizador\Desktop\Repositorio, ento iria usar-se: file:///Users/NomeUtilizador/Desktop/Repositorio De notar que o Windows aceita o separador de pastas /, apesar de a sua sintaxe normal ser \. Temos agora uma pasta de trabalho a ser controlada pelo Subversion e l que iremos adicionar todos os nossos ficheiros de trabalho. Foi criada uma pasta escondida .svn. No mexer nesta pasta!

3. Criar/Adicionar ficheiros e Commit


Agora que j temos pasta, vamos adicionar um ficheiro de texto simples: 1. Criamos um ficheiro de texto (texto.txt) como em qualquer outra pasta 2. Adicionamos o texto Ol Mundo ao ficheiro Supondo que o ponto 1 e 2 j foram feitos (no preciso explicao, certo?), vamos verificar o estado (status) da pasta de trabalho, com o comando svn stat ou svn st (abreviatura). O resultado: ? texto.txt O ? significa que o ficheiro texto.txt ainda no foi adicionado ao controlo do svn e mesmo que agora se fizesse um commit, o ficheiro no iria parar ao repositrio. Vamos ento adicionar o ficheiro ao repositrio: svn add texto.txt Isto acabou de adicionar o ficheiro ao repositrio e a partir de agora o ficheiro ir ser controlado para versionamento. Se fizermos svn stat, podemos ver: A texto.txt Isto significa que o ficheiro texto.txt foi adicionado ao repositrio (o A vem de ADD). Tudo o que se faz numa pasta controlada por svn precisa de um commit para que as alteraes sejam realmente impostas no repositrio. At l as alteraes s esto na nossa cpia local. Como queremos agora confirmar o que fizmos at agora, vamos fazer um Commit: svn commit m <Texto com a descrio do que fizmos. Pode ir vazio> Na altura em que fazemos commit temos de escrever tambm uma entrada no registo (log), possivelmente a explicar o que fizmos no projecto, porque que criamos determinado ficheiro ou porque que o apagmos, ou podemos nem dizer nada (escrever apenas ). Usa-se ento o argumento m seguido do texto entre aspas. Exemplo: svn commit m Ficheiro texto.txt adicionado Agora as alteraes j sero visveis por todos e quando algum for fazer um Update, ir receber o novo ficheiro que acabmos de adicionar.

4. Update (actualizao da pasta de trabalho)


Para nos certificarmos que estamos a usar a ltima verso dos ficheiros do projecto, temos de fazer Updates. Um update feito assim: svn update Isto ir actualizar a nossa cpia local da pasta de trabalho para a ltima verso no repositrio. Se entretanto altermos algum ficheiro na nossa pasta, esse ficheiro no ser actualizado com a verso do repositrio. Para perceber isso, abram o ficheiro texto.txt e alterem o seu contedo (para Ola, apagando o Mundo). Ao fazermos um svn stat podemos ver que agora o ficheiro est indicado com um M atrs, que indica que existe um Modificao. Para vermos as diferenas entre o que est no repositrio e o que est na nossa cpia local, podemos usar o svn diff (que no irei explicar para j). Se agora fizssemos um commit, o ficheiro passaria a estar com o texto Ola tanto na nossa cpia local, como no repositrio.

4.1 Resoluo de Conflictos


Imaginando agora que estvamos a trabalhar em grupo e duas pessoas tinham as suas pastas de trabalho, com checkouts do mesmo repositrio (convm!). Cada um deles agora tem o ficheiro texto.txt com o texto Ola. De seguida o utilizador A altera o ficheiro para Eu sou o utilizador A e o B faz tambm uma alterao para Eu sou o utilizador B. Iremos ter um conflito! Se o utilizador A fizer um commit, ento quando o utilizador B tentar fazer um commit, o que vai aparecer ser isto: Sending texto.txt svn: Commit failed (details follow): svn: File '/texto.txt' is out of date

Esta mensagem indica-nos que enquanto altervamos o nosso ficheiro localmente, algum o alterou de outro lado e fez um commit, invalidando assim o nosso commit! Somos agora obrigados a fazer um update para obter a verso mais recente do repositrio. Claro que como cada um dos utilizadores escreveu algo diferente e conflituoso, um update ir avisar-nos que existe um conflito com o nosso ficheiro modificado que estamos a tentar submeter: Conflict discovered in 'texto.txt'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p: postpone diz para ignorar por agora o conflicto. Mais tarde tratamos da resoluo do problema. De qualquer maneira no podemos fazer commit enquanto o conflicto existir. diff-full mostra as diferenas entre o(s) ficheiro(s) em conflicto. edita os ficheiros num editor (que por enquanto ainda no est definido, logo no funciona) mine-conflict diz para juntar as duas verses e que ao ser encontrado um conflito, as nossas alteraes iro prevalecer. theirs-conflict diz para juntar as duas verses e que ao ser encontrado um conflito, a verso da outra pessoa que ir prevalecer e que as nossas alteraes sero descartadas. show all options, mostra mais opes, tais como: mine-full serve para indicarmos que no queremos juntar o nosso ficheiro ao do outro utilizador e muito menos queremos resolver as situaes de conflito. O nosso ficheiro ir ficar como est, e o do outro completamente descartado. theirs-full o contrrio do mine-full, indicando que o ficheiro do outro utilizador que est correcto por inteiro e que o nosso pode ir para o lixo.

df: e: mc: tc:

s: mf:

tc:

Imaginemos agora a seguinte situao: O ficheiro texto.txt tem agora as seguintes linhas: Linha1 Linha2 Linha3 Ambos os utilizadores A e B tm a mesma verso do ficheiro e agora os dois decidem alterar o ficheiro, mas em linhas diferentes:

10

O utilizador A altera o ficheiro para: Linha1 -> Eu sou o A Linha2 Linha3 O utilizador B altera o ficheiro para: Linha1 Linha2 -> Eu sou o B Linha3 Se o utilizador A fizer commit, a verso do repositrio ser a que tem a linha 1 alterada. O utilizador B ao fazer update (depois de um commit falhado, por exemplo) no ir receber nenhum aviso de conflicto, uma vez que o ficheiro sofreu um merGe automtico...da aparecer a mensagem: G texto.txt Updated to revision ##. O merge a mistura entre as duas verses. Uma vez que no haviam conflictos na mesma linha, o svn misturou o ficheiro e se agora o formos abrir, iremos ver: Linha1 -> Eu sou o A Linha2 -> Eu sou o B Linha3 Agora sim, podemos fazer um commit uma vez que j no h conflicto e ento o utilizador A ter de fazer um update para receber a nova verso do ficheiro. Aviso: convm falar sempre com a outra pessoa, alertando para o facto de ter havido um conflito ou um merge, de forma a que no se gerem problemas (ou que o conflicto no volte a surgir).

11

5. Revert (reverter para o ficheiro original)


O comando revert ir reverter o ficheiro local para o ficheiro que est no repositrio ( como se fizssemos um undo s alteraes que fizmos no nosso ficheiro local). Se depois de um update, fizermos alguma alterao ao ficheiro, podemos descartar essas alteraes usando: svn revert <nome-do-ficheiro> Exemplo: svn revert texto.txt Tambm se podem reverter todos os ficheiros de uma pasta, usando svn revert .

6. Apagar, mover ou copiar ficheiros


Os ficheiros no devem ser apagados, movidos ou copiados mo (utilizando comandos de DOS ou usando o explorador do Windows, ou o equivalente em Linux), uma vez que ir gerar problemas no controlo desses ficheiros. Um ficheiro que seja apagado, ir aparecer no status (svn stat) com o smbolo !: ! texto.txt

Nesta situao um revert ou um commit no iro funcionar. Ou se restaura o ficheiro (se por acaso ele foi movido por engano, convm ir busc-lo sua nova localizao e copi-lo de novo para a pasta de trabalho), ou ento poder-se- fazer um update (svn up) e ento o ficheiro ser reposto com a verso que est no repositrio. Qualquer alterao que tivesse sido feita localmente e no tivesse sofrido um commit ir obviamente perder-se. A maneira correcta para apagar um ficheiro usar o comando delete (ou del, remove, rm): svn del texto.txt ou ento svn del . (para todos os ficheiros da pasta) Se por acaso nos enganmos, basta utilizar o revert e o update para voltarmos a ficar com os ficheiros. Para mover ficheiros o comando o move (mv, ren, rename): svn mv texto.txt readme.txt

12

O svn ir mostrar que o ficheiro readme.txt foi adicionado e que o ficheiro texto.txt foi apagado: A D readme.txt texto.txt

Se fizermos agora commit as alteraes sero gravadas e os outros utilizadores que faam update iro sofrer a adio do ficheiro readme.txt e iro ficar sem o ficheiro texto.txt. Para se copiar um ficheiro o comando o copy (cp): svn cp readme.txt copia_de_readme.txt O resultado : A copia_de_readme.txt Se fizermos um status (svn st), teremos: A + copia_de_readme.txt Podemo agora fazer um commit para ficarmos com os 2 ficheiros no repositrio. - readme.txt - copia_de_readme.txt

13

7. Update para reviso antiga


Se a dada altura acharmos que as alteraes que fizmos esto erradas e que queremos voltar atrs, podemos reverter para um estado antigo (no confundir com o revert). Para isso iremos usar o update, com um argumento adicional: svn update r X onde X o nmero da reviso. Podemos saber em que reviso estamos e mostrar tambm as revises antigas e os seus respectivos comentrios, usando svn log, que ir mostrar uma lista com o nmero da reviso, autor e data. Pode-se tambm usar o argumento v (verbose) no comando log, para indicar mais informao, como por exemplo, os ficheiros afectados e de que forma (updates, deletes, adds). Utilizando a informao do log, e supondo que estamos na reviso 7, queremos agora voltar para a reviso 4. Para isso iremos escrever: svn update r 4 A reviso 4 ir aparecer na pasta e a podemos aceder aos ficheiros antigos. Ateno: No se pode fazer commit a partir de uma reviso anterior (como uma forma de reverter para estados anterior e continuar a partir da). Antes do commit, temos sempre de voltar a fazer update para a reviso actual (HEAD) e s a se poder fazer o commit. Se for necessrio ficar com a verso antiga de um ficheiro, deve-se utilizar o seguinte: Supondo que existe um ficheiro texto.txt na nossa pasta, que est na reviso 10 e que queremos a verso da reviso 5 desse ficheiro, iremos copiar com o comando: svn copy texto.txt@5 texto-antigo.txt Isso ir fazer com que seja criado um novo ficheiro texto-antigo.txt com os contedos que tnhamos na altura da reviso 5 (isso conseguido com a arroba @<reviso>). De seguida iremos apagar o ficheiro actual texto.txt com svn del texto.txt e de seguida iremos renomear o texto-antigo.txt para texto.txt: svn ren texto-antigo.txt texto.txt Faz-se um commit e temos ento o ficheiro de uma reviso antiga, na nova reviso.

14

You might also like