Você está na página 1de 33

Trabalhando com o SVN no Eclipse

Contedo
Introduo ............................................................................................................................................... 3
Objetivos ................................................................................................................................................. 3
Pr-Requisitos ......................................................................................................................................... 3
Mo na Massa! ........................................................................................................................................ 3
Configurando o repositrio no Eclipse .................................................................................................. 3
Criando uma aplicao Java ................................................................................................................. 6
Criando um Branch ............................................................................................................................ 12
Realizando modificaes no branch ................................................................................................... 16
Realizando um merge do trunk para o branch .................................................................................... 20
Realizando um merge do branch para o trunk .................................................................................... 27
Lidando com conflitos entre o trunk e o branch ................................................................................. 29
Concluso .............................................................................................................................................. 33



















Introduo
Neste pequeno tutorlul vou upresentur umu descrlo bslcu de como se trubulhur com o Subverslon (SVN) no Ecllpse.
Emboru outros servldores de controle de verso este|um sendo utlllzudos cudu vez muls pelo mercudo, como o Glt, por
exemplo, o SVN ulndu , sem duvldu, utlllzudo por umu grunde quuntldude de usurlos nus empresus.
Apesur du grunde utlllzuo, nem sempre us melhores prtlcus so udotudus quundo se trubulhu com este tlpo de
ferrumentu, nem mesmo recursos como merglng e brunchlng so utlllzudos nu mulorlu dus vezes (ou pelu mulorlu dos
usurlos), o que ucubu por provocur u subutlllzuo du ferrumentu, ufetundo consequentemente u produtlvldude dus
equlpes.
Objetivos
Apresentur orlentues bslcus de como trubulhur com o SVN no Ecllpse, que um dos umblentes de desenvolvlmento
Juvu muls utlllzudos do mercudo.
Sero upresentudos exemplos de como crlur um brunch, reullzur um merge entre o brunch e o trunk, e resolver problemus
de confllto durunte o merge.
Os conceltos upresentudos so vlldos puru outros umblentes de desenvolvlmento, mus os procedlmentos podem mudur de
ucordo com os pluglns utlllzudos em cudu um.
Pr-Requisitos
Como no o foco do tutorlul upresentur u lnstuluo do servldor SVN, necessrlo ter um reposltrlo dlsponivel puru os
testes. Umu dlcu, puru se testur em umu mqulnu locul, lnstulur o VlsuulSVN Server Munuger.
E necessrlo tumbm ter o plugln do SVN lnstuludo no Ecllpse.
Mo na Massa!
Configurando o repositrio no Eclipse
3uru comeur u utlllzur um reposltrlo do SVN necessrlo conflgur-lo n o Ecllpse. 3uru lsso preclso ter u URL do
reposltrlo, o que pode ser conseguldo com o udmlnlstrudor do reposltrlo.
Com u URL em mos, ubru u perspectlvu do reposltrlo SVN no Ecllpse:

Cllcundo com o boto uuxlllur do mouse, seleclone u opo puru udlclonur um novo locul:

Adlclone u URL do reposltrlo de testes no cumpo lndlcudo:

3ode ser necessrlo lnformur o usurlo e senhu puru ucesso. Estu lnformuo pode ser conseguldu com o udmlnlstrudor do
servldor:

Aps estes pussos, o reposltrlo ser upresentudo nu perspectlvu, conforme ubulxo:

A estruturu sugerldu pelo SVN possul trs dlretrlos: brunches, tugs e trunk.
/trunk - o dlretrlo onde o desenvolvlmento prlnclpul do pro|eto ocorre, ou se|u, onde sempre est u verso muls recente e
estvel dos urtefutos oflcluls;
/brunches o dlretrlo onde pode-se crlur rumlflcues du llnhu prlnclpul de desenvolvlmento (trunk);
/tugs o dlretrlo onde se pode urmuzenur rumlflcues du llnhu prlnclpul que so crludus, e tulvez destruidus, mus nuncu
modlflcudus.

Criando uma aplicao Java
Crle, no C:\, um dlretrlo chumudo workspuce, e nele crle dols dlretrlos chumudos work1 e work2. Estes sero os
workspuces usudos puru os testes.
Abru o Ecllpse upontundo puru o workspuce work1. Aps conflgurur o umblente (udlclonur um JDK uproprludo) crle um
pro|eto Juvu slmples, chumudo Culculudoru. Neste pro|eto crle um pucote chumudo testes.svn, e nele crle umu clusse
chumudu Culculudoru.|uvu, com os segulntes mtodos:
01
public class Calculadora {
02

03
public BigDecimal somar(BigDecimal param1, BigDecimal
param2) throws Exception{
04
return null;
05 }
06

07
public BigDecimal subtrair(BigDecimal param1, BigDecimal
param2) throws Exception{
08
return null;
09 }
10

11
public BigDecimal multiplicar(BigDecimal param1, BigDecimal
param2) throws Exception{
12
return null;
13 }
14

15
public BigDecimal dividir(BigDecimal param1, BigDecimal
param2) throws Exception{
16
return null;
17 }
18 }
Estu u estruturu do pro|eto ups u crluo du clusse:

Vumos ugoru colocur o pro|eto no reposltrlo que conflgurumos unterlormente. Cllque com o boto uuxlllur do mouse sobre
o pro|eto, v ut u opo de menu Teum e escolhu u opo Shure 3ro|ect:

Nu prxlmu telu, escolhu u opo SVN e prosslgu. Nu telu segulnte, escolhu o reposltrlo conflgurudo unterlormente e
prosslgu:

Nu prxlmu telu, temos u opo de conflgurur o nome sobre o quul o pro|eto ser urmuzenudo no reposltrlo, e suu
locullzuo. Murque u segundu opo, e cllcundo no boto Select lnforme o dlretrlo trunk:

Ao retornur du telu, estu dever ser u conflguruo du telu:

3rosslgu, e nu telu flnul dlglte umu mensugem lnlclul puru o verslonumento e conflrme:

O segulnte comundo ser executudo contru o servldor, udlclonundo o pro|eto uo reposltrlo:
mkdlr purents -m Verslonumento do pro|eto Culculudoru. https://vottl/svn/culculudoru/trunk/Culculudoru
checkout https://vottl/svn/culculudoru/trunk/Culculudoru -r HEAD depth=lmmedlutes force
Logo em seguldu, ser upresentudu u perspectlvu de slncronlzuo, onde poderemos commltur o pro|eto no reposltrlo,
ou se|u, envlur o conteudo do pro|eto puru o reposltrlo, llterulmente.
As setus clnzu sobre os urqulvos e dlretrlos lndlcum que estes urqulvos devem ser comltudos, ento seleclone os mesmos
e, cllcundo com o boto uuxlllur do mouse sobre os ltens seleclonudos, escolhu u opo commlt:

Nu telu segulnte, lncluu um comentrlo lnlclul e conflrme:

Os segulntes comundos sero executudos, lndlcundo que os urtefutos forum commltudos com sucesso:
udd -N C:\workspuce\work1\Culculudoru\.settlngs
A C:/workspuce/work1/Culculudoru/.settlngs
udd -N C:\workspuce\work1\Culculudoru\src
A C:/workspuce/work1/Culculudoru/src
udd -N C:\workspuce\work1\Culculudoru\src\testes
A C:/workspuce/work1/Culculudoru/src/testes
udd -N C:\workspuce\work1\Culculudoru\src\testes\svn
A C:/workspuce/work1/Culculudoru/src/testes/svn
udd -N C:\workspuce\work1\Culculudoru\.settlngs\org.ecllpse.|dt.core.prefs
A C:/workspuce/work1/Culculudoru/.settlngs/org.ecllpse.|dt.core.prefs
udd -N C:\workspuce\work1\Culculudoru\.pro|ect
A C:/workspuce/work1/Culculudoru/.pro|ect
udd -N C:\workspuce\work1\Culculudoru\src\testes\svn\Culculudoru.|uvu
A C:/workspuce/work1/Culculudoru/src/testes/svn/Culculudoru.|uvu
udd -N C:\workspuce\work1\Culculudoru\.clussputh
A C:/workspuce/work1/Culculudoru/.clussputh
commlt -m Verslonumento lnlclul dos urtefutos. (8 puths speclfled)
Addlng C:/workspuce/work1/Culculudoru/.clussputh
Addlng C:/workspuce/work1/Culculudoru/.pro|ect
Addlng C:/workspuce/work1/Culculudoru/.settlngs
Addlng C:/workspuce/work1/Culculudoru/.settlngs/org.ecllpse.|dt.core.prefs
Addlng C:/workspuce/work1/Culculudoru/src
Addlng C:/workspuce/work1/Culculudoru/src/testes
Addlng C:/workspuce/work1/Culculudoru/src/testes/svn
Addlng C:/workspuce/work1/Culculudoru/src/testes/svn/Culculudoru.|uvu
Trunsmlttlng flle dutu
Voltundo u perspectlvu Juvu, podemos perceber que o pro|eto est no reposltrlo, pelu notuo u frente do nome do pro|eto,
e podemos ver ulndu quul usurlo reullzou o commlt du clusse Culculudoru:

3ols bem, temos o pro|eto verslonudo no trunk. Como dlto unterlormente, no trunk deverlum ser muntldos os cdlgos
estvels de um pro|eto. 3uru u reullzuo de testes ou lmplementues que podem ser lnstvels por um longo periodo, pode
ser preferivel crlur um brunch. No brunch colocumos umu cplu do pro|eto que est no trunk, mus sem perder u refernclu.
A equlpe que trubulhu no cdlgo do brunch pode ulndu munter umu slncronlzuo com o trunk, truzendo deste us
utuullzues pertlnentes, evltundo que o cdlgo do brunch flque desutuullzudo com reluo uo trunk, mus evltundo que o
cdlgo lnstvel do brunch lnfluencle negutlvumente o cdlgo do trunk.
3uru nosso tutorlul, vumos supor que u lmplementuo dos mtodos du clusse Culculudoru sero reullzudos no brunch. No
dlu-u-dlu tul lmplementuo poderlu ser feltu no trunk, mus como nosso ob|etlvo uprender u crlur brunches, vumos supor
que estu se|u umu necessldude reul.

Criando um Branch
3uru crlur um brunch v ut u perspectlvu do reposltrlo SVN e, expundlndo os dlretrlos, cllque com o boto uuxlllur do
mouse sobre o pro|eto Culculudoru, e no menu de contexto escolhu u opo Brunch/Tug:

Nu telu segulnte preclsumos lnformur o dlretrlo destlno, no reposltrlo, puru o pro|eto. Como estumos crlundo um brunch,
o dlretrlo destlno ser o brunch. 3orm, como podem exlstlr vrlos brunches de um mesmo pro|eto uo mesmo tempo,
convenlente crlur um subdlretrlo com um nome que ldentlflque o ob|etlvo do brunch.
3uru fuzer lsso, seleclone o brunch utruvs do boto Select:

Ao voltur puru u telu unterlor, d um nome uo subdlretrlo. Isso pode ser felto udlclonundo o nome u URL resultunte do
processo unterlor. 3uru este exemplo, o dlretrlo ser metodos_culculudoru. Els u URL flnul:
https://vottl/svn/culculudoru/brunches/metodos_culculudoru
Lembre-se de murcur nu telu u opo que permlte que o dlretrlo udlclonul se|u crludo (Creute uny lntermedlute folders thut
ure mlsslng.):

Nu prxlmu telu podemos escolhur quul revlso queremos puru o brunch. No nosso cuso vumos escolhur u opo HEAD,
que lndlcu que ser envludu puru o brunch u verso muls utuul exlstente no trunk. 3orm, se necessrlo, umu verso
especiflcu poder ser seleclonudu:

Nu telu segulnte udlclone um comentrlo pertlnente, e fuu u conflrmuo:

Se formos ugoru u perspectlvu do reposltrlo, poderemos ver que o conteudo do trunk fol copludo puru o brunch
conflgurudo:

Ve|u que ut o momento coplumos o conteudo do pro|eto puru o trunk e u purtlr do trunk crlumos um brunch puru reullzur u
lmplementuo, mus no nosso workspuce temos upenus o pro|eto que est llgudo uo trunk. Isso slgnlflcu que se flzermos
quulquer modlflcuo, e flzermos um commlt, estus modlflcues sero envludus uo trunk.
Realizando modificaes no branch
Se qulsermos reullzur modlflcues no brunch crludo, teremos que conflgurur um pro|eto que este|u llgudo u ele.
3uru fuzer lsso, vumos relnlclur o Ecllpse e como workspuce vumos seleclonur o dlretrlo work2, crludo no lniclo do tutorlul.
Asslm que tlver uberto o Ecllpse no novo workspuce fuu us conflgurues necessrlus (conflguruo de umu JDK pudro,
por exemplo).
Abru u perspectlvu do SVN e, usslm como no lniclo do tutorlul, lnslru umu novo locul de reposltrlo, lnformundo u URL do
reposltrlo de exemplo.
Ao termlnur o processo de conflguruo do reposltrlo, ubru o dlretrlo brunch. Cllque com o boto uuxlllur do mouse sobre
o dlretrlo metodos_culculudoru, e no menu de contexto escolhu u opo Checkout:

Com lsso vumos coplur o conteudo do brunch puru o reposltrlo, puru trubulhur nele.
A prxlmu telu upresentu os dudos puru o pro|eto qe ser crludo:

Repure que o nome do pro|eto fol recuperudo e dudo como sugesto. Tumbm h u posslbllldude de escolher umu revlso
especiflcu, ou ento u ultlmu (HEAD). Vumos munter us conflgurues sugerldus.
Nu prxlmu telu ser sugerldo como workspuce o workspuce utuul (work2). Muntenhu o vulor sugerldo e prosslgu, cllcundo
em Flnlsh.
Ao voltur puru u perspectlvu Juvu, possivel verlflcur que o pro|eto fol conflgurudo, e que referenclu o brunch crludo:

Agoru vumos slmulur u sltuuo reul de ter que ulterur o cdlgo em umbos os loculs, trunk (work1) e brunch (work2) e ter de
munt-los slncronlzudos.
Vumos comeur codlflcundo u clusse Culculudoru no workspuce work2, que referenclu o brunch, no quul estumos:
01
public class Calculadora {
02

03
public BigDecimal somar(BigDecimal param1, BigDecimal
param2) throws Exception{
04
return param1.add(param2);
05 }
06

07
public BigDecimal subtrair(BigDecimal param1, BigDecimal
param2) throws Exception{
08
return param1.subtract(param2);
09 }
10

11
public BigDecimal multiplicar(BigDecimal param1, BigDecimal
param2) throws Exception{
12
return param1.multiply(param2);
13 }
14

15
public BigDecimal dividir(BigDecimal param1, BigDecimal
param2) throws Exception{
16
return param1.divide(param2);
17 }
18 }
Depols de codlflcur u clusse, fuu o commlt dus modlflcues no brunch, descrevendo us modlflcues:

E extremumente lmportunte reullzur o commlt de todus us ulterues do workspuce no bruch/trunk untes de reullzur
quulquer operuo de merge. Alls, umu exlgnclu!
Vumos ugoru reullzur umu modlflcuo no pro|eto do trunk, puru ver como recuperur estu modlflcuo, depols, no brunch.
Mude de workspuce, voltundo puru u workspuce work1.
Voc ver que, como esperudo, os mtodos nu clusse Culculudoru do workspuce work1 esto como untes, sem
lmplementuo.
Adlclone ento, u clusse Culculudoru, um mtodo u muls:
1
public BigDecimal potencial(BigDecimal param1, BigDecimal
param2) throws Exception{
2
return null;
3 }
Fuu o commlt du modlflcuo, udlclonundo um comentrlo pertlnente:

Retorne puru o workspuce work2.
Realizando um merge do trunk para o branch
Agoru, no workspuce work2, vumos reullzur um merge puru receber us utuullzues do trunk, ou se|u, o novo mtodo
udlclonudo u clusse Culculudoru.
Este procedlmento deverlu ser, como comentudo unterlormente, umu prtlcu reullzudu frequentemente puru que o brunch
no flque multo tempo desutuullzudo em reluo uo trunk. Isto mlnlmlzu problemus de confllto nu horu de mover puru o
trunk us modlflcues do brunch, procedlmento este que reullzuremos depols.
Seleclone u clusse Culculudoru no pro|eto, e cllcundo com o boto uuxlllur do mouse sobre elu escolhu u opo de
Merge no menu Teum:

A telu segulnte nos upresentu ulgumus opes puru u operuo de merge:

3uru este tutorlul us duus prlmelrus opes so us que lnteressum.
3uru estu operuo que reullzuremos ugoru, muntenhu seleclonudu u prlmelru opo. Estu opo usudu puru cupturur
mudunus que forum reullzudus no trunk ou outro brunch, e truz-lus uo brunch no quul estumos trubulhundo. Conflrme u
operuo, cllcundo em Next:

A prxlmu telu upresentu umu sugesto do urtefuto u purtlr do quul dese|umos reullzur o merge, ou se|u, u clusse
Culculudoru presente no pro|eto do trunk. Neste ponto voc poderlu upontur puru u mesmu clusse presente em ulgum outro
brunch, cuso exlstlsse, ou se|u, no preclsu ser necessurlumente um merge u purtlr do trunk. Mus no nosso cuso
munteremos u sugesto, pols reulmente preclsumos reullzur o merge com o trunk.
Nu prxlmu telu so upresentudus opes puru u operuo. Buslcumente, us sugestes murcudus por pudro so melhores,
pols lndlcum que u cudu problemu encontrudo, o usurlo dever ser consultudo sobre o que fuzer. Muntenhu us sugestes
upresentudus por pudro:

Ao conflrmur, u segulnte telu upresentudu, lndlcundo que umu utuullzuo fol encontrudu:

Aps u concluso du operuo, voc ver que o mtodo udlclonudo nu clusse Culculudoru do trunk upureceu nu clusse
Culculudoru do brunch:

Vule lembrur que, upesur de termos reullzudo estu operuo puru upenus umu clusse, elu pode ser reullzudu puru vrlos
urtefutos uo mesmo tempo.
Agoru que u clusse fol modlflcudu, fuu o commlt dus ulterues no brunch, lnformundo um comentrlo pertlnente puru u
mudunu:

Realizando um merge do branch para o trunk
Depols do trubulho reullzudo no brunch, preclsumos relntegr-lo uo trunk, umu horu ou outru.
Multus vezes o trubulho em um brunch pode ser to rpldo quunto ulgumus horus, ou longo u ponto de levur vrlos dlus ou
meses. O tumunho do trubulho u ser reullzudo que lr determlnur lsso.
Independente de quunto tempo ele leve, o futo de reullzur perlodlcumente o merge do trunk com o brunch, como felto
unterlormente, deve mlnlmlzur os problemus de conflltos quundo chegur u horu de truzer o brunch puru o trunk, umu vez
que, ldeulmente, os conflltos exlstentes | tero sldo resolvldos no momento em que se levou us mudunus do trunk puru o
brunch.
Vumos ugoru truzer o que fol felto no brunch puru o trunk. Mude puru o workspuce work1.
Seleclone u clusse Culculudoru no pro|eto, e cllcundo com o boto uuxlllur do mouse sobre elu escolhu u opo de
Merge no meu Teum
Nu telu que upurece em seguldu, muntenhu seleclonudu u segundu opo, que nos permltlr truzer us mudunus do brunch
puru o trunk:

Nu telu segulnte, nu quul lnformumos u purtlr de onde ser felto o merge, seleclone u clusse Culculudoru do brunch, como
lndlcudo:

Nu prxlmu telu conflrme us opes oferecldus como pudro, e uo flnullzur u telu segulnte ser upresentudu, lndlcundo que
umu utuullzuo ser reullzudu:

Conflrme cllcundo no boto OK. Ao trmlno du operuo us utuullzues do brunch sero upllcudus uo trunk.

Lidando com conflitos entre o trunk e o branch
At ugoru reullzumos o merge entre o trunk e o brunch sem nenhum problemu de confllto, mus lsto est longe de ser u
reulldude do dlu-u-dlu de trubulho dus equlpes de desenvolvlmento. Nu verdude os conflltos so multo comuns. As bous
prtlcus procurum melhorur u produtlvldude dus equlpes, munter u estubllldude dos reposltrlos (prlnclpulmente do trunk) e
mlnlzur os conflltos, mus ellmlnur os conflltos, prlnclpulmente em um umblente onde multos desenvolvedores utuullzum os
mesmos urqulvos, ulgo multo dlficll. 3or estu ruzo bom se ucostumur com estes conflltos, e se ucostumur u resolv-los
tumbm.
3uru slmulur este cenrlo, vumos modlflcur o ultlmo mtodo udlclonudo u clusse Culculudoru. 3ercebu que ele ulndu no fol
lmplementudo, e que recebe dols purmetros. Nu verdude preclsumos modlflcur um de seus purmetros, e tumbm
preclsumos lmplement-lo.
Alndu no workspuce work1 modlflque o mtodo como ubulxo:
1
public BigDecimal potencial(BigDecimal param1, int param2) throws Exception{
2
return param1.pow(param2);
3 }
Reullze o commlt dus modlflcues, e slm, coloque um comentrlo! (no u tou que estou butendo nestu teclu):

Agoru mude puru o workspuce work2 e tumbm fuu estus modlflcues no mtod, exutumente como no trunk, reullzundo o
commlt uo flnul.
Depols de reullzudo o commlt, fuu um merge, truzendo do trunk us modlflcues puru o brunch.
Apesur de termos ulterudo o mesmo mtodo em umbos os loculs, nenhumu utuullzuo encontrudu, umu vez que us
modlflcues forum exutumente us mesmus, ou se|u, nenhum confllto encontrudo.
Vumos ugoru slmulur um confllto reul, quundo o mesmo locul modlflcudo, porm com vulores dlferentes.
Mude puru o workspuce work1 e ultere o mtodo dlvldlr conforme upresentudo ubulxo, reullzundo o commlt uo flnul:
1
public BigDecimal dividir(BigDecimal param1, BigDecimal
param2) throws Exception{
2
return param1.divide(param2, BigDecimal.ROUND_UP);
3 }
Agoru mude puru o workspuce work2 e ultere o mtodo dlvldlr conforme upresentudo ubulxo, reullzundo o commlt no flnul:
1
public BigDecimal dividir(BigDecimal param1, BigDecimal
param2) throws Exception{
2
return param1.divide(param2, BigDecimal.ROUND_HALF_EVEN);
3 }
Agoru tente novumente truzer do trunk puru o brunch us modlflcues nu clusse Culculudoru e ve|u o resultudo.

Destu vez h um confllto, pols o mtodo fol modlflcudo em muls de um locul (reposltrlo), e no mesmo ponto.
As opes upresentudus nu telu que upresentudu so:
- Murcur como em confllto. Resolverel muls turde.
- Resolver o confllto usundo u mlnhu verso do urqulvo.
- Resolver o confllto usundo u verso do urqulvo que est chegundo.
- Me delxe edltur o urqulvo com os murcudores de confllto lnserldos.
- Abrlr um edltor grflco de soluo de conflltos.
3urtlculurmente recomendo lldur o quundo untes com os conflltos, portunto, escolhu u ultlmu opo e conflrme. O Edltor
upresentu os conflltos u serem resolvldos:

Suponhumos que nossu verso do brunch est corretu. Ento feche o edltor, e umu mensugem ser upresentudu,
perguntundo se o confllto fol resolvldo:

Murque que o confllto fol resolvldo (prlmelru opo) e conflrme:

Nu telu que lndlcu que umu utuullzuo ser feltu fuu u conflrmuo. Depols reullze o commlt du clusse Culculudoru no
brunch.
Destu formu, cudu lmplementuo do mtodo, no trunk e no brunch, flcou de umu formu. Se qulsssemos delx-lus lguuls,
busturlu ter ucelto u dlferenu vlndu do trunk (cuso estu fosse u corretu) ou ento, u purtlr do trunk, puxur us ulterues do
brunch e ucelt-lus.

Concluso
Neste tutorlul forum upresentudos os pussos necessrlos puru se conflgurur um reposltrlo SVN no Ecllpse e puru se
udlclonur um pro|eto uo reposltrlo.
Forum upresentudos tumbm os pussos necessrlos puru se crlur um brunch, como reullzur o merge entre o brunch e o
trunk (em umbus us dlrees) e como resolver conflltos de verslonumento.
Com lsso concluimos este tutorlul!
Espero que tenhu sldo de bom provelto, e que com o que fol upresentudo uqul voc possu melhorur suu rotlnu de trubulho
upllcundo muls ulgumus bous prtlcus no seu dlu-u-dlu de utlllzuo do SVN.