Sistemas de Controle de Versão

Transcrição

Sistemas de Controle de Versão
Sistemas de
Controle de Versão
Juliano F. Ravasi
Setembro / 2008
http://juliano.info/
Conteúdo
●
●
●
Setembro/2008
Parte 1:
Controle de Versões
Parte 2:
Trabalhando com Subversion
Parte 3:
Trabalhando com Mercurial
Juliano F. Ravasi - Sistemas de Controle de Versão
2
Controle de Versões
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
3
Motivação
O que é controle de versões?
●
Gerenciamento de múltiplas revisões
–
–
–
–
–
Setembro/2008
Documentos, projetos, software, etc.
Histórico de alterações sofridas
Permitir consultar revisões anteriores
Permitir comparações entre revisões
Permitir trabalho cooperativo
Juliano F. Ravasi - Sistemas de Controle de Versão
4
Motivação
O que é controle de versões?
●
Vários nomes:
–
–
–
–
–
●
Setembro/2008
Revision control system (RCS)
Version control system (VCS)
Software Configuration Management (SCM)
Source Code Management
Source Control
Controle de versão não é exclusivo para
gerenciamento de software.
Juliano F. Ravasi - Sistemas de Controle de Versão
5
Motivação
Por que controle de versões?
●
Software é algo caro de ser produzido
–
–
–
Setembro/2008
Consome muito tempo
Exige cooperação, organização, disciplina
É importante armazenar tudo que é feito
Juliano F. Ravasi - Sistemas de Controle de Versão
6
Motivação
Onde é utilizado?
●
●
●
●
Sistemas de arquivos
Suítes de escritório
Ambientes colaborativos
Gerenciamento de software
Importante para qualquer desenvolvedor ou
empresa de desenvolvimento de software.
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
7
Motivação
Onde é utilizado?
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
8
Motivação
Onde é utilizado?
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
9
Recursos
Registro de revisões
●
Toda alteração realizada é registrada
–
–
–
●
Rápido acesso a revisões anteriores
–
–
Setembro/2008
Quem, quando, o que e por quê?
Nada é perdido para sempre
Descartar código ruim sem remorso
Determinar introdução de defeitos
Manutenção de código legado
Juliano F. Ravasi - Sistemas de Controle de Versão
10
Recursos
Auditoria
●
●
●
Setembro/2008
Comparação entre versões do projeto,
mostrando diferenças linha-a-linha
Apontar desenvolvedores responsáveis
por cada trecho de código do projeto
Automação de testes de estabilidade
Juliano F. Ravasi - Sistemas de Controle de Versão
11
Recursos
Ramificações
●
●
Setembro/2008
Múltiplas linhas de desenvolvimento
dentro do mesmo projeto
Permite divergência e reconvergência do
desenvolvimento
Juliano F. Ravasi - Sistemas de Controle de Versão
12
Recursos
Trabalho cooperativo
●
●
Setembro/2008
Vários desenvolvedores trabalhando
sobre o mesmo projeto
Mescla das alterações dos diversos
desenvolvedores ou ramificações
Juliano F. Ravasi - Sistemas de Controle de Versão
13
Recursos
Segurança
●
●
●
Setembro/2008
Autenticação criptográfica de histórico
Controle de acesso sobre o repositório
Cópias de segurança (backup)
Juliano F. Ravasi - Sistemas de Controle de Versão
14
Modelos
●
Centralizado (cliente-servidor)
–
–
●
Distribuído
–
–
Setembro/2008
Um repositório central de revisões
Desenvolvedores obtém cópias de trabalho
do repositório central
Cada desenvolvedor tem seu repositório
Desenvolvedores copiam repositórios e
alterações de outros desenvolvedores
Juliano F. Ravasi - Sistemas de Controle de Versão
15
Modelos
Centralizado (cliente-servidor)
●
Vantagens:
–
–
–
●
Desvantagens:
–
–
Setembro/2008
Controle de acesso
Cópia de segurança
Controle de qualidade
Dependência do repositório central
Ponto único de falha
Juliano F. Ravasi - Sistemas de Controle de Versão
16
Modelos
Distribuído
●
Vantagens:
–
–
–
●
Desvantagens:
–
–
Setembro/2008
Permite submissões particulares, offline
Melhor suporte a ramificação e mescla
Independência da rede, mais rápido
Estimula o isolamento de desenvolvedores
Questões de privacidade e segurança
Juliano F. Ravasi - Sistemas de Controle de Versão
17
Modelos
Centralizado vs. distribuído
●
Assunto “quente” nos últimos anos
–
●
Há sobreposição entre os modelos
–
●
Ferramentas distribuídas podem ser usadas
no modelo centralizado, quando necessário
Ainda não existe a ferramenta perfeita
–
Setembro/2008
Opiniões inflamadas, guerra de egos
Cada modelo de desenvolvimento exige um
modelo de controle de versões
Juliano F. Ravasi - Sistemas de Controle de Versão
18
Conceitos
Repositório
●
●
Núcleo do controle de versões
Possui uma “linha do tempo” embutida
–
Setembro/2008
Coletânea de revisões do projeto
Juliano F. Ravasi - Sistemas de Controle de Versão
19
Conceitos
Repositório
●
Revisão
–
–
Setembro/2008
Estado em um determinado instante
Imutável após criada
Juliano F. Ravasi - Sistemas de Controle de Versão
20
Conceitos
Cópia de trabalho
●
Cópia do repositório em certa revisão
–
–
Setembro/2008
Geralmente a mais recente
Checkout (obtenção de uma cópia)
Juliano F. Ravasi - Sistemas de Controle de Versão
21
Conceitos
Cópia de trabalho
●
Onde ocorre o desenvolvimento
–
–
O sistema reconhece as alterações feitas
Algumas operações devem ser explícitas
●
Setembro/2008
Adição, remoção, moção e cópia de arquivos
Juliano F. Ravasi - Sistemas de Controle de Versão
22
Conceitos
Cópia de trabalho
●
Submissão (commit)
–
Setembro/2008
Alterações são registradas em uma nova
revisão do repositório
Juliano F. Ravasi - Sistemas de Controle de Versão
23
Conceitos
Ramificações (branches)
●
Linhas alternativas de desenvolvimento
–
–
Setembro/2008
Explícitas
Implícitas
Juliano F. Ravasi - Sistemas de Controle de Versão
24
Conceitos
Ramificações (branches)
●
Explícitas
–
–
–
Setembro/2008
Manutenção de versões legadas
Implementação de novos recursos
Experiências no código do projeto
Juliano F. Ravasi - Sistemas de Controle de Versão
25
Conceitos
Ramificações (branches)
●
Implícitas
–
–
Setembro/2008
Cópia de trabalho
Múltiplos desenvolvedores
Juliano F. Ravasi - Sistemas de Controle de Versão
26
Conceitos
Mescla (merge)
●
Reintegração de ramificações
–
–
Em grande parte é automatizado
Conflitos podem ocorrer
●
Setembro/2008
O desenvolvedor pode precisar interagir
Juliano F. Ravasi - Sistemas de Controle de Versão
27
Conceitos
Rótulos (tags)
●
Setembro/2008
Nomes atribuídos a revisões
Juliano F. Ravasi - Sistemas de Controle de Versão
28
Gerenciamento de software
Fluxos de trabalho
●
●
Solitário
Centralizado
–
–
●
Distribuído
–
–
–
Setembro/2008
Repositório local
Repositório remoto
Parceiro
Equipe
Hierárquico
Juliano F. Ravasi - Sistemas de Controle de Versão
29
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Solitário
Juliano F. Ravasi - Sistemas de Controle de Versão
30
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Centralizado, repositório local
Juliano F. Ravasi - Sistemas de Controle de Versão
31
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Centralizado, repositório remoto
Juliano F. Ravasi - Sistemas de Controle de Versão
32
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Distribuído, parceiro
Juliano F. Ravasi - Sistemas de Controle de Versão
33
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Distribuído, equipe
Juliano F. Ravasi - Sistemas de Controle de Versão
34
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Distribuído, hierárquico
Juliano F. Ravasi - Sistemas de Controle de Versão
35
Gerenciamento de software
Sistemas de controle de versões
SourceAnyware
Vault
Git
darcs
MOG
ArX
Surround
FtpVC
PlasticSCM
CVS
Store
Stellation
ClearCase
Vesta
AllFusion
SourceSafe
DCVS
Aegis
Setembro/2008
PureCM
GNU arch
Mercurial
RCS
Team Foundation Server
FirePublish
Team Coherence
SourceHaven
Perforce
CodeVille
Fossil
codeBeamer
MKS
QVCS
TeamWare
Code Co-op
AccuRev
Evolution
DesignSync
SVK
Serena
FileHamster
Aldon
AVS
CVSNT
Subversion
OpenCVS
LibreSource
AlienBrain
StarTeam
BitKeeper
Synergy
Juliano F. Ravasi - Sistemas de Controle de Versão
Monotone
Bazaar
36
Gerenciamento de software
Sistemas de controle de versões
Centralizado
Aegis
CVSNT
CVS
Aberto
Distribuído
OpenCVS
CodeVille
Stellation
Subversion
ArX arch
Fossil
Vesta
darcs
Git
Bazaar
DCVS
LibreSource
Mercurial Monotone
SVK
AccuRev Aldon AlienBrain AllFusion
Proprietário
AVS
ClearCase
codeBeamer
DesignSync Evolution FileHamster
FirePublish
Perforce
FtpVC
MKS
PureCM QVCS
SourceAnyware
SourceSafe
Code Co-op
MOG
Serena
SourceHaven
StarTeam
BitKeeper
TeamWare
Store
Surround Synergy Team Coherence
Vault
Setembro/2008
PlasticSCM
Team Foundation Server
Juliano F. Ravasi - Sistemas de Controle de Versão
37
Gerenciamento de software
Sistemas de controle de versões
●
Visão geral dos VCSs abertos:
–
Centralizados:
●
▶
–
▶
●
●
http://subversion.tigris.org/
Git
Mercurial
Bazaar
...
http://git.or.cz/
http://www.selenic.com/mercurial/
http://bazaar-vcs.org/
Mais:
–
–
Setembro/2008
http://www.nongnu.org/cvs/
Distribuídos:
●
●
CVS
Subversion
http://linuxmafia.com/faq/Apps/vcs.html
http://en.wikipedia.org/wiki/List_of_revision_control_software
Juliano F. Ravasi - Sistemas de Controle de Versão
38
Sistemas de controle de versão
CVS
●
●
●
●
●
●
Setembro/2008
Criado para substituir o RCS (1980s)
Obsoleto, desenvolvimento estagnado
Modelo centralizado
Possui grande base de usuários
Possui defeitos e limitações de projeto
Escrito em C, monolítico
Juliano F. Ravasi - Sistemas de Controle de Versão
39
Sistemas de controle de versão
Subversion
●
“Sucessor” do CVS
–
●
●
●
●
●
●
Setembro/2008
Projetado para contornar os seus defeitos
Desenvolvido por CollabNet Inc.
Modelo centralizado
Robusto e maduro
Ênfase em qualidade, larga escala
Sem restrições a tipos de arquivos
Escrito em C, modular
Juliano F. Ravasi - Sistemas de Controle de Versão
40
Sistemas de controle de versão
Subversion
●
Projeto em camadas
–
Repositório
●
–
Acesso ao repositório
●
–
–
Bindings: C, Python, Perl, Java, Ruby
Cliente
●
Setembro/2008
Local, WebDAV, svnserve
Cópia de trabalho
Biblioteca de cliente
●
–
BorlandDB, fsfs
svn, TortoiseSVN, Subclipse, KDESvn, Trac, ...
Juliano F. Ravasi - Sistemas de Controle de Versão
41
Sistemas de controle de versão
Git
●
Criado para gerenciar o kernel do Linux
–
–
●
●
●
●
●
●
Setembro/2008
Após controvérsia sobre o BitKeeper
Inspirado no Monotone
Inicialmente por Linus Torvalds
Modelo distribuído
Ênfase em desenvolvimento não-linear
Autenticação criptográfica do histórico
Gerencia conteúdo, ao invés de arquivos
Escrito em C, monolítico
Juliano F. Ravasi - Sistemas de Controle de Versão
42
Sistemas de controle de versão
Mercurial
●
Criado simultaneamente ao Git
–
●
●
●
●
●
Setembro/2008
Inspirado no Monotone
Desenvolvido por Matt Mackall
Modelo distribuído
Autenticação criptográfica do histórico
Ênfase em uso por grandes projetos
Escrito em Python, modular
Juliano F. Ravasi - Sistemas de Controle de Versão
43
Sistemas de controle de versão
Bazaar
●
●
●
Desenvolvido por Canonical Inc.
Modelo distribuído
Ênfase em facilidade, flexibilidade
–
●
●
Setembro/2008
Suporte a múltiplos fluxos de trabalho
Desempenho ruim
Escrito em Python, modular
Juliano F. Ravasi - Sistemas de Controle de Versão
44
Gerenciamento de software
O que armazenar?
●
Arquivos produzidos pelo desenvolvedor:
✔ código
fonte
✔ scripts de automação
✔ documentação escrita
✔ figuras, imagens e ícones
●
possivelmente apenas os originais, usando ferramentas
automáticas para converter entre formatos e tamanhos
✔ “makefiles”
●
Setembro/2008
a menos que sejam criados por um processo automático
(por ex: ./configure)
Juliano F. Ravasi - Sistemas de Controle de Versão
45
Gerenciamento de software
O que não armazenar?
●
Arquivos gerados automaticamente:
✘ código-objeto
✘ programas
compilados
✘ documentação automática
●
Arquivos com configurações locais:
✘ credenciais
●
de acesso a banco-de-dados
Arquivos criados acidentalmente:
✘ “core
dumps”
✘ arquivos temporários
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
46
Trabalhando com
Subversion
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
47
Trabalhando com Subversion
Características gerais
●
Repositório vs. cópia de trabalho
–
●
Ramificações, rótulos
–
–
●
Implícito, parte da árvore do repositório
Criados através de cópias leves
Características únicas:
–
–
–
Setembro/2008
Armazenados em lugares distintos
Propriedades
Diretórios
WebDAV
Juliano F. Ravasi - Sistemas de Controle de Versão
48
Trabalhando com Subversion
Características gerais
●
Recomendação
–
●
Usar versão 1.5 ou superior.
Informações
–
–
–
Projeto: http://subversion.tigris.org/
Manual: http://svnbook.red-bean.com/
Clientes:
●
●
●
Setembro/2008
Windows: http://tortoisesvn.tigris.org/
Eclipse: http://subclipse.tigris.org/
KDE: http://kdesvn.alwins-world.de/
Juliano F. Ravasi - Sistemas de Controle de Versão
49
Trabalhando com Subversion
Repositório
●
Sistema de arquivos
–
Baseado em ligações
●
●
–
Revisões numéricas, seriais
●
●
Revisão zero: repositório em branco
Sugestões de organização:
–
Setembro/2008
Cópias leves, copy-on-write
Banco-de-dados transacional
Um repositório por projeto
(incluindo subprojetos)
Juliano F. Ravasi - Sistemas de Controle de Versão
50
Trabalhando com Subversion
Repositório
●
Criação do repositório
–
svnadmin create diretório
●
●
Cria um novo repositório Subversion em branco
(revisão zero) em ‘diretório’.
Convenções de hierarquia
/
trunk/
branches/
tags/
Setembro/2008
← tronco
← ramificações
← rótulos
Juliano F. Ravasi - Sistemas de Controle de Versão
51
Trabalhando com Subversion
Repositório
●
Setembro/2008
Convenções de hierarquia
Juliano F. Ravasi - Sistemas de Controle de Versão
52
Trabalhando com Subversion
Repositório
●
Criação da hierarquia inicial
–
Método 1:
svn checkout file:///home/user/svn/repo
cd repo
svn mkdir trunk branches tags
svn commit -m "Directory hierarchy."
–
Método 2 (bash):
r=file:///home/user/svn/repo
svn mkdir $r/{trunk,branches,tags} -m "..."
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
53
Trabalhando com Subversion
Ciclo de trabalho
●
1. Obtenção (checkout)
–
svn checkout
❶ svn checkout
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
54
Trabalhando com Subversion
Ciclo de trabalho
●
2. Desenvolvimento
❷ (edição)
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
55
Trabalhando com Subversion
Ciclo de trabalho
●
3. Comparação, reversão
–
–
–
svn status
svn diff
svn revert
❸ svn diff
svn revert
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
56
Trabalhando com Subversion
Ciclo de trabalho
●
4. Submissão
–
svn commit
❹ svn commit
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
57
Trabalhando com Subversion
Ciclo de trabalho
●
5. Atualização
–
svn update
❺ svn update
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
58
Trabalhando com Subversion
Comandos
●
Ferramentas principais:
–
svn
●
–
svnadmin
●
●
Manutenção do repositório.
Outras ferramentas:
–
–
–
–
Setembro/2008
Cliente padrão, cópia de trabalho.
svndumpfilter
svnlook
svnserve
svnsync
Juliano F. Ravasi - Sistemas de Controle de Versão
59
Trabalhando com Subversion
Comandos
●
Acesso ao repositório
–
Local
●
–
WebDAV sobre HTTP
●
●
–
svn://svn.example.com/svn/repo/...
svnserve sobre SSH
●
Setembro/2008
http://svn.example.com/svn/repo/...
https://svn.example.com/svn/repo/...
svnserve
●
–
file:///home/user/svn/repo/...
svn+ssh://svn.example.com/svn/repo/...
Juliano F. Ravasi - Sistemas de Controle de Versão
60
Trabalhando com Subversion
Comandos
●
Acesso ao repositório
–
Composição da URL
svn://svn.example.com/svn/project/subproject/trunk/
Endereço do
servidor Subversion
Setembro/2008
Endereço do
repositório
Caminho armazenado
no repositório
Juliano F. Ravasi - Sistemas de Controle de Versão
61
Trabalhando com Subversion
Comandos
●
Importação
–
svn import [diretório] URL
●
●
Obtenção
–
svn checkout URL [diretório]
●
–
–
Obtém uma cópia de trabalho.
svn export URL [diretório]
●
Obtém uma cópia limpa do projeto.
svn update [diretório]
●
Setembro/2008
Importa um projeto existente em um repositório.
Atualiza a cópia de trabalho com o repositório.
Juliano F. Ravasi - Sistemas de Controle de Versão
62
Trabalhando com Subversion
Comandos
●
Edição
–
svn add alvo
●
–
svn delete alvo
●
–
Cria uma cópia de um arquivo ou diretório.
svn move orig dest
●
Setembro/2008
Cria um diretório no controle de versão.
svn copy orig dest
●
–
Remove um arq./dir. do controle de versão.
svn mkdir diretório
●
–
Adiciona um arq./dir. ao controle de versão.
Move ou renomeia um arquivo ou diretório.
Juliano F. Ravasi - Sistemas de Controle de Versão
63
Trabalhando com Subversion
Comandos
●
Consulta e comparação
–
svn status [alvo]
●
–
svn diff [alvo]
●
●
Mostra alterações realizadas em arquivos.
Reversão
–
svn revert [alvo]
●
Setembro/2008
Mostra arquivos alterados, adicionados, etc.
Reverte alterações realizadas em arquivos.
Juliano F. Ravasi - Sistemas de Controle de Versão
64
Trabalhando com Subversion
Comandos
●
Submissão
–
svn update
●
●
–
svn commit [alvo]
●
●
Setembro/2008
Atualiza a cópia de trabalho antes de submeter,
opcional.
Podem ocorrer conflitos ao mesclar as
alterações do repositório com as suas.
Submete o estado atual da cópia de trabalho
para o repositório, criando uma nova revisão.
Nesse processo, é necessário fornecer uma
breve descrição das alterações realizadas.
Juliano F. Ravasi - Sistemas de Controle de Versão
65
Trabalhando com Subversion
Comandos
●
Resolução de conflitos
–
svn resolve --accept arg [alvo]
●
–
svn resolved alvo
●
–
–
Informa que o conflito foi manualmente
resolvido, e destrava a cópia de trabalho.
svn status
svn commit [alvo]
●
Setembro/2008
Resolução simples, informa qual versão do alvo
deverá ser preservada.
Após resolver os conflitos, tentar submeter
novamente.
Juliano F. Ravasi - Sistemas de Controle de Versão
66
Trabalhando com Subversion
Comandos
●
Informação e auditoria
–
svn info [alvo]
●
–
svn log [alvo]
●
–
Mostra registro de alterações de um arquivo,
diretório ou do projeto.
svn blame arquivo
●
Setembro/2008
Mostra informações diversas sobre a cópia de
trabalho ou o alvo fornecido.
Acusa os desenvolvedores que alteraram por
último cada linha de um arquivo.
Juliano F. Ravasi - Sistemas de Controle de Versão
67
Trabalhando com Subversion
Consulta de histórico (svn log)
r3 | juliano | 2008-07-18 00:41:18 -0300 (Fri, 18 Jul 2008) | 8 lines
Changed paths:
M /trunk
A /trunk/CalculatorForm.cpp
A /trunk/CalculatorForm.h
A /trunk/CalculatorForm.ui
M /trunk/calculator.cpp
M /trunk/calculator.pro
User interface design.
Designed the user interface of the calculator, using Qt Designer.
No functions have been implemented yet. The calculator is
non-functional.
Added some patterns for generated files to svn:ignore.
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
68
Trabalhando com Subversion
Atualização (svn update)
●
Para visitar revisões passadas
–
–
●
Para retornar à última revisão
–
●
svn update
Legenda
–
–
–
–
–
–
Setembro/2008
svn update -r revisão
svn update -r {data}
A:
D:
U:
C:
G:
E:
adicionado
apagado
atualizado
conflito
mesclado
já existente
(Added)
(Deleted)
(Updated)
(Conflicted)
(merGed)
(Existed)
Juliano F. Ravasi - Sistemas de Controle de Versão
69
Trabalhando com Subversion
Comparação (svn diff)
●
Alterações na cópia de trabalho
–
●
svn diff [alvo]
Comparar revisões arbitrárias
–
svn diff -r x:y [alvo]
●
–
svn diff -c x [alvo]
●
Setembro/2008
Alterações entre revisões ‘x’ e ‘y’.
Alterações entre revisões ‘x’-1 e ‘x’.
Juliano F. Ravasi - Sistemas de Controle de Versão
70
Trabalhando com Subversion
Comparação (svn diff)
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
71
Trabalhando com Subversion
Consulta de estado (svn status)
●
Legenda
–
–
–
–
–
–
–
–
–
●
adicionado
(Added)
em conflito
(Conflicted)
apagado
(Deleted)
ignorado
(Ignored)
modificado
(Modified)
substituído
(Replaced)
item externo
(eXternal)
item desconhecido, não controlado
item controlado, porém ausente
Mais detalhes
–
Setembro/2008
A:
C:
D:
I:
M:
R:
X:
?:
!:
svn help status
Juliano F. Ravasi - Sistemas de Controle de Versão
72
Trabalhando com Subversion
Ramificações
●
Comandos
–
svn copy repo/trunk
repo/branches/branch
●
–
–
svn switch repo/trunk
svn switch repo/branch/branch
●
Setembro/2008
Cria uma nova ramificação.
Alterna entre ramificações.
Juliano F. Ravasi - Sistemas de Controle de Versão
73
Trabalhando com Subversion
Mescla e reversão
●
Mescla entre ramificações
–
svn merge URL
●
–
svn merge --reintegrate URL
●
–
Reintegra alterações de uma ramificação ao
tronco.
svn merge -c rev URL
●
Setembro/2008
Mescla alterações de uma ramificação diferente
na ramificação atual da cópia de trabalho.
Mescla apenas revisão ‘rev’.
Juliano F. Ravasi - Sistemas de Controle de Versão
74
Trabalhando com Subversion
Mescla e reversão
●
Reversão
–
svn merge -c -rev URL
●
●
●
Setembro/2008
Desfaz as alterações da revisão ‘rev’.
Pode ser usado na própria ramificação.
É uma mescla “ao contrário”.
Juliano F. Ravasi - Sistemas de Controle de Versão
75
Trabalhando com Subversion
Rótulos
●
Caso especial de ramificação
–
–
●
São usados apenas como referência
Devem ser “somente-leitura” após criados.
Comando
–
svn copy repo/trunk
repo/tags/tag
●
Setembro/2008
Cria um novo rótulo.
Juliano F. Ravasi - Sistemas de Controle de Versão
76
Trabalhando com Subversion
Propriedades
●
Comandos
–
svn proplist [alvo]
●
–
svn propget prop alvo
●
–
Altera uma propriedade (no editor externo).
svn propdel prop alvo
●
Setembro/2008
Configura o conteúdo de uma propriedade.
svn propedit prop alvo
●
–
Recupera conteúdo de uma propriedade.
svn propset prop cont alvo
●
–
Lista propriedades.
Apaga uma propriedade.
Juliano F. Ravasi - Sistemas de Controle de Versão
77
Trabalhando com Subversion
Propriedades
●
Propriedades padrão
–
Diretórios e arquivos
●
●
●
●
●
●
●
–
Revisões
●
●
●
Setembro/2008
svn:eol-style
svn:executable
svn:externals
svn:ignore
svn:keywords
svn:mime-type
svn:needs-lock
svn:author
svn:date
svn:log
Juliano F. Ravasi - Sistemas de Controle de Versão
78
Trabalhando com
Mercurial
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
79
Trabalhando com Mercurial
Características gerais
●
Distribuído
–
●
Ramificações, rótulos
–
–
Setembro/2008
Cópia de trabalho contém o repositório:
São armazenados juntos
Explícitos, possuem tratamento especial
Cada cópia de trabalho é uma ramificação
Juliano F. Ravasi - Sistemas de Controle de Versão
80
Trabalhando com Mercurial
Características gerais
●
Informações
–
–
–
Projeto: http://www.selenic.com/mercurial/
Manual: http://hgbook.red-bean.com/
Clientes:
●
●
Setembro/2008
Windows: http://tortoisehg.sourceforge.net/
Eclipse:
http://www.vectrace.com/mercurialeclipse/
Juliano F. Ravasi - Sistemas de Controle de Versão
81
Trabalhando com Mercurial
Repositório
●
Sistema de arquivos
–
–
Armazenamento eficiente, seguro e rápido
Revisões:
●
●
●
Sugestões de organização:
–
–
Setembro/2008
Numéricas, seriais
Hash SHA-1 do changeset
Um repositório por subprojeto
Projeto: vários subprojetos agrupados
Juliano F. Ravasi - Sistemas de Controle de Versão
82
Trabalhando com Mercurial
Ciclo de trabalho
●
1. Início do projeto (init)
–
hg init
➊ hg init
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
83
Trabalhando com Mercurial
Ciclo de trabalho
●
2. Desenvolvimento, submissão local
–
hg status, diff, revert, commit
➋ hg
hg
hg
hg
Setembro/2008
status
diff
revert
commit
Juliano F. Ravasi - Sistemas de Controle de Versão
84
Trabalhando com Mercurial
Ciclo de trabalho
●
3. Ramificação
–
hg clone
➌ hg clone
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
85
Trabalhando com Mercurial
Ciclo de trabalho
●
4. Mais desenvolvimento
➍ hg
hg
hg
hg
Setembro/2008
status
diff
revert
commit
➍ hg
hg
hg
hg
Juliano F. Ravasi - Sistemas de Controle de Versão
status
diff
revert
commit
86
Trabalhando com Mercurial
Ciclo de trabalho
●
5. Mescla
–
hg pull, push
➎ hg pull
hg push
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
87
Trabalhando com Mercurial
Ciclo de trabalho
Setembro/2008
hg pull
hg pull
hg pull
hg pull
Juliano F. Ravasi - Sistemas de Controle de Versão
88
Trabalhando com Mercurial
Ciclo de trabalho
hg pull
hg pull
hg pull
hg pull
hg push
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
89
Trabalhando com Mercurial
Ciclo de trabalho
hg import
hg import
hg import
hg import
hg export
lista de e-mails
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
90
Trabalhando com Mercurial
Ciclo de trabalho
Mercurial
Subversion
(distribuído)
(centralizado)
1
*
Remoto
push
pull
Local
1
update
commit
update
commit
1
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
*
91
Trabalhando com Mercurial
Grafo de revisões
tip
3: 3a63
2: ecf3
Setembro/2008
0: 9117
Bob
Alice
1: 273c
Juliano F. Ravasi - Sistemas de Controle de Versão
92
Trabalhando com Mercurial
Grafo de revisões
tip
tip
3: 3a63
3: 3a63
2: ecf3
2: ecf3
Setembro/2008
0: 9117
1: 273c
hg clone
Bob
Alice
1: 273c
0: 9117
Juliano F. Ravasi - Sistemas de Controle de Versão
93
Trabalhando com Mercurial
Setembro/2008
tip
tip
5: 5f24
5: 5102
4: ce3b
4: 207f
3: 3a63
3: 3a63
2: ecf3
2: ecf3
1: 273c
1: 273c
0: 9117
Bob
Alice
Grafo de revisões
0: 9117
Juliano F. Ravasi - Sistemas de Controle de Versão
94
Trabalhando com Mercurial
Grafo de revisões
tip
7: 5f24
6: ce3b
tip
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
hg pull
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
95
Trabalhando com Mercurial
Grafo de revisões
merge
hg merge
tip
7: 5f24
tip
6: ce3b
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
96
Trabalhando com Mercurial
Grafo de revisões
tip
8: b4d0
7: 5f24
tip
6: ce3b
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
97
Trabalhando com Mercurial
Grafo de revisões
tip
tip
8: b4d0
8: b4d0
7: 5102
7: 5f24
6: 207f
6: ce3b
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
Bob
Alice
3: 3a63
hg pull (alice)
hg push (bob)
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
98
Trabalhando com Mercurial
Comandos
●
Comandos comuns
–
–
–
–
–
–
–
–
–
–
–
–
Setembro/2008
hg
hg
hg
hg
hg
hg
hg
hg
hg
hg
hg
hg
add
annotate
commit
copy
diff
help
log
remove
rename
revert
status
update
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
add)
blame)
commit)
copy)
diff)
help)
log)
delete)
move)
revert)
status)
update)
Juliano F. Ravasi - Sistemas de Controle de Versão
99
Trabalhando com Mercurial
Comandos
●
Acesso a repositórios
–
Local
●
●
–
HTTP, Mercurial
●
●
–
http://hg.example.com/hg/project/
https://hg.example.com/hg/project/
SSH, Mercurial
●
Setembro/2008
/home/user/hg/project/
file:///home/user/hg/project/
ssh://hg.example.com/hg/project/
Juliano F. Ravasi - Sistemas de Controle de Versão
100
Trabalhando com Mercurial
Criação e clonagem
●
Criação do projeto
–
hg init [diretório]
●
●
Clonagem
–
hg clone origem [diretório]
●
●
●
Setembro/2008
Transforma o diretório atual (ou o diretório
informado) em um repositório Mercurial
Cria uma cópia do repositório de origem
É, implicitamente, uma ramificação
Hg lembra seu repositório de origem
Juliano F. Ravasi - Sistemas de Controle de Versão
101
Trabalhando com Mercurial
Trabalho distribuído
●
Trazer (puxar) submissões
–
hg pull [URL]
●
●
●
–
hg incoming [URL]
●
Setembro/2008
Recupera as diferenças entre o repositório
indicado e o seu, e aplica as alterações.
Se ‘URL’ for omitido, seu repositório de origem
(fornecido ao ‘hg clone’) é considerado.
Atualiza apenas o repositório, use ‘hg update’
para atualizar a cópia de trabalho.
Mostra o que há no repositório indicado que não
há no seu, e pode ser trazido com ‘hg pull’.
Juliano F. Ravasi - Sistemas de Controle de Versão
102
Trabalhando com Mercurial
Trabalho distribuído
●
Levar (empurrar) submissões
–
hg push [URL]
●
●
●
–
hg outgoing [URL]
●
Setembro/2008
Determina as diferenças entre o seu repositório
e o indicado, e as aplica remotamente.
Se ‘URL’ for omitido, seu repositório de origem
(fornecido ao ‘hg clone’) é considerado.
Não cria ramificações remotas, seu repositório
precisa estar compatível (via ‘hg pull’).
Mostra o que há no seu repositório que não há
no indicado, e pode ser levado com ‘hg push’.
Juliano F. Ravasi - Sistemas de Controle de Versão
103
Trabalhando com Mercurial
Trabalho distribuído
●
Mescla
–
hg heads [rev]
●
–
hg merge [rev]
●
●
Setembro/2008
Mostra as “revisões-cabeça” do grafo de
revisões (todas as ramificações).
Mescla as alterações de uma determinada
cabeça à cópia de trabalho.
Caso ‘rev’ seja omitido, e só houver uma outra
cabeça possível de ser mesclada (não
ambígua), tal cabeça será selecionada.
Juliano F. Ravasi - Sistemas de Controle de Versão
104
Trabalhando com Mercurial
Consulta de estado
●
Comandos
–
hg status
●
–
hg identify [-i] [-n] [-b] [-t]
●
–
Mostra qual a revisão atual da cópia de trabalho.
hg parents [-r rev] [alvo]
●
Setembro/2008
Mostra arquivos alterados, adicionados, etc.
Mostra as revisões ascendentes da revisão atual
(ou a revisão fornecida).
Juliano F. Ravasi - Sistemas de Controle de Versão
105
Trabalhando com Mercurial
Consulta ao histórico
●
Histórico
–
hg log [-v]
●
●
Visualização
–
hg view
●
●
Setembro/2008
Descrição textual do histórico.
Visualiza o histórico interativamente.
Grafo de revisões.
Juliano F. Ravasi - Sistemas de Controle de Versão
106
Trabalhando com Mercurial
Ramificações
●
Clonagem
–
–
–
●
Locais, anônimas
–
–
●
Criadas implicitamente
Submissão sobre revisão intermediária
Locais, explícitas
–
–
Setembro/2008
Criadas implicitamente
Basta clonar a cópia de trabalho
Eficiente: utiliza hardlinks quando possível
Criadas através de ‘hg branch’
Armazenadas no próprio repositório
Juliano F. Ravasi - Sistemas de Controle de Versão
107
Trabalhando com Mercurial
Rótulos
●
●
●
Referenciam determinados changesets
Fazem parte do controle de versões
Comandos
–
hg tag [-l] [-r rev] nome
●
●
–
hg tag [-l] --remove nome
●
Setembro/2008
Cria um novo rótulo ‘nome’ para a revisão ‘rev’.
Parâmetro ‘-l’: rótulo local.
Apaga um rótulo.
Juliano F. Ravasi - Sistemas de Controle de Versão
108
Obrigado!
Juliano F. Ravasi
http://juliano.info/
Esta apresentação:
http://juliano.info/pt/vcs
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
109
Sistemas de
Controle de Versão
Juliano F. Ravasi
Setembro / 2008
http://juliano.info/
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
1
Sistemas de Controle de Versão
(palestra – mini-curso)
Esta é uma palestra sobre sistemas de controle de
versão, voltada em especial para o gerenciamento
de software. Esta palestra é ministrada no formato
de um mini-curso.
Versão 2008.1.
Copyright © 2008 – Juliano F. Ravasi
Licensed under Creative Commons AttributionNoncommercial-Share Alike 2.5 Brazil License
Conteúdo
●
●
●
Setembro/2008
Parte 1:
Controle de Versões
Parte 2:
Trabalhando com Subversion
Parte 3:
Trabalhando com Mercurial
Juliano F. Ravasi - Sistemas de Controle de Versão
2
A palestra está dividida em três partes.
Na primeira parte, dissertativa, é apresentado o
conceito de controle de versões, desde sua
motivação até seu uso voltado ao desenvolvimento
de software.
Na segunda parte, interativa, é apresentado o
modelo centralizado de controle de versões,
utilizando a ferramenta Subversion.
Na terceira parte, interativa, é apresentado o modelo
distribuído de controle de versões, utilizando a
ferramenta Mercurial.
Controle de Versões
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
Parte 1: Controle de Versões
●
●
●
●
Motivação
Recursos
Conceitos
Gerenciamento de software
● Fluxos de trabalho
● Sistemas de controle de versões
● O que armazenar?
● O que não armazenar?
3
Motivação
O que é controle de versões?
●
Gerenciamento de múltiplas revisões
–
–
–
–
–
Setembro/2008
Documentos, projetos, software, etc.
Histórico de alterações sofridas
Permitir consultar revisões anteriores
Permitir comparações entre revisões
Permitir trabalho cooperativo
Juliano F. Ravasi - Sistemas de Controle de Versão
4
O controle de versões é o gerenciamento de
múltiplas revisões de um documento, software, ou
qualquer outro conjunto de informações que sofra
alterações ao longo do tempo.
O objetivo é manter um histórico das alterações
realizadas, de forma a permitir consultar revisões
anteriores, comparar diferentes revisões ou manter
diferentes ramificações do projeto.
O controle de versões também habilita o trabalho
cooperativo de vários desenvolvedores sobre um
mesmo projeto.
Motivação
O que é controle de versões?
●
Vários nomes:
–
–
–
–
–
●
Setembro/2008
Revision control system (RCS)
Version control system (VCS)
Software Configuration Management (SCM)
Source Code Management
Source Control
Controle de versão não é exclusivo para
gerenciamento de software.
Juliano F. Ravasi - Sistemas de Controle de Versão
5
O controle de versões é conhecido por diversos
nomes, mas geralmente os dois nomes mais
comuns são “Revision Control System” ou “Version
Control System”.
Note que o primeiro, “RCS”, é também o nome de
um antigo sistema de controle de versões, portanto
“VCS” é preferido para evitar confusão.
O nome “Software Configuration Management” as
vezes é usado para o conceito de “VCS”, mas
“SCM” é usado principalmente para um conceito
mais abrangente, onde controle de versões é
apenas uma das ferramentas envolvidas.
Outros nomes menos usados incluem “Source Code
Management” e “Source Control”, quando o
controle de versões é empregado especificamente
para o gerenciamento de software.
Motivação
Por que controle de versões?
●
Software é algo caro de ser produzido
–
–
–
Setembro/2008
Consome muito tempo
Exige cooperação, organização, disciplina
É importante armazenar tudo que é feito
Juliano F. Ravasi - Sistemas de Controle de Versão
6
No nosso contexto, do gerenciamento de software, o
controle de versões é uma ferramenta importante
pois software é algo caro de ser produzido, em
relação ao tempo que exige e o número de
desenvolvedores que precisam ser empregados.
Um único projeto de software pode envolver desde
um único desenvolvedor até dezenas de milhares.
O controle de versões é a ferramenta que permite
essa maleabilidade no fluxo de desenvolvimento de
um software.
Motivação
Onde é utilizado?
●
●
●
●
Sistemas de arquivos
Suítes de escritório
Ambientes colaborativos
Gerenciamento de software
Importante para qualquer desenvolvedor ou
empresa de desenvolvimento de software.
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
7
O conceito de controle de versões foi empregado
inicialmente em sistemas de arquivos, onde cada
gravação de um arquivo fazia uma nova revisão
ser registrada, mantendo o histórico de alterações
de cada arquivo. Ainda hoje sistemas de arquivos
são desenvolvidos com essa funcionalidade.
Motivação
Onde é utilizado?
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
8
Em suites de escritório, programas como Microsoft
Word ou Google Docs possuem recursos que
habilitam diversos usuários registrar alterações em
um único documento, sem perder o estado anterior.
Dessa forma, duas ou mais pessoas trabalhando
sobre o mesmo documento podem facilmente
verificar as alterações feitas pelos outros
participantes.
Motivação
Onde é utilizado?
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
9
Em ambientes colaborativos, o conceito de revisões
também possui grande importância, como em
wikis.
Especial notabilidade para a Wikipédia, a
enciclopédia online de conteúdo livre que qualquer
usuário pode editar. Toda alteração pode ser
verificada pelos outros usuários, e estes podem
reverter facilmente qualquer alteração não
apropriada ao conteúdo.
Recursos
Registro de revisões
●
Toda alteração realizada é registrada
–
–
–
●
Rápido acesso a revisões anteriores
–
–
Setembro/2008
Quem, quando, o que e por quê?
Nada é perdido para sempre
Descartar código ruim sem remorso
Determinar introdução de defeitos
Manutenção de código legado
Juliano F. Ravasi - Sistemas de Controle de Versão
10
O principal recurso oferecido pelo controle de
versões, é registro de revisões. Toda alteração feita
sobre o documento ou projeto é registrada, com
informações sobre quem fez a alteração, quando
ocorreu, o que foi alterado, e por que a alteração
foi feita.
O desenvolvedor tem a liberdade de apagar ou
reescrever qualquer parte do documento ou
projeto, sem preocupações. Nada é perdido para
sempre, e o desenvolvedor pode recuperar as
revisões anteriores facilmente quando precisar.
Essa característica de registro histórico ou máquina
do tempo permite determinar quando defeitos
foram introduzidos, ou manter código legado de um
software.
Recursos
Auditoria
●
●
●
Setembro/2008
Comparação entre versões do projeto,
mostrando diferenças linha-a-linha
Apontar desenvolvedores responsáveis
por cada trecho de código do projeto
Automação de testes de estabilidade
Juliano F. Ravasi - Sistemas de Controle de Versão
11
Agregado ao registro histórico de revisões surge
outra característica importante: a auditoria do
projeto.
O sistema de controle de versões integra
ferramentas que permitem, por exemplo, comparar
cada linha de duas diferentes revisões de um único
arquivo, apontando quais trechos foram alterados.
Ou ainda, mostrar qual desenvolvedor é
responsável pela última alteração em determinada
linha do arquivo.
O sistema de controle de versões pode ser integrado
a uma plataforma de testes que garanta a
estabilidade do projeto. Por exemplo, não permitir
que os desenvolvedores registrem alterações que
façam o programa falhar numa suíte de testes.
Recursos
Ramificações
●
●
Setembro/2008
Múltiplas linhas de desenvolvimento
dentro do mesmo projeto
Permite divergência e reconvergência do
desenvolvimento
Juliano F. Ravasi - Sistemas de Controle de Versão
12
Mais uma característica importante do controle de
versões é permitir que o projeto se ramifique em
múltiplas linhas de desenvolvimento, que seguem
em paralelo e possuem um passado comum.
Estas ramificações podem depois reconvergir
novamente em uma única linha de
desenvolvimento.
Recursos
Trabalho cooperativo
●
●
Setembro/2008
Vários desenvolvedores trabalhando
sobre o mesmo projeto
Mescla das alterações dos diversos
desenvolvedores ou ramificações
Juliano F. Ravasi - Sistemas de Controle de Versão
13
O controle de versões habilita o trabalho cooperativo,
de forma que vários desenvolvedores possam
trabalhar sobre o mesmo conjunto de arquivos.
Cada desenvolvedor trabalhando simultaneamente
sobre o mesmo projeto acaba por criar pequenas
ramificações (implícitas), que são periodicamente
reintegradas (ou mescladas) ao projeto.
Recursos
Segurança
●
●
●
Setembro/2008
Autenticação criptográfica de histórico
Controle de acesso sobre o repositório
Cópias de segurança (backup)
Juliano F. Ravasi - Sistemas de Controle de Versão
14
Por fim, o controle de versões habilita alguns
aspectos de segurança para o projeto. Os recursos
disponíveis e a forma como são implementados
variam bastante entre diferentes ferramentas.
Algumas ferramentas permitem autenticar de forma
criptográfica o histórico das alterações ocorridas no
projeto.
Outra forma de segurança é controlar quem acessa o
repositório que o projeto está armazenado, e quais
partes do projeto cada desenvolvedor pode
acessar.
Por fim, o controle de versões habilita diferentes
formas de manter cópias de segurança do projeto.
Modelos
●
Centralizado (cliente-servidor)
–
–
●
Distribuído
–
–
Setembro/2008
Um repositório central de revisões
Desenvolvedores obtém cópias de trabalho
do repositório central
Cada desenvolvedor tem seu repositório
Desenvolvedores copiam repositórios e
alterações de outros desenvolvedores
Juliano F. Ravasi - Sistemas de Controle de Versão
15
Há dois modelos fundamentalmente diferentes de
controle de versões em uso hoje.
O modelo centralizado, também conhecido como
cliente-servidor, já vem sendo utilizado desde a
década de 1970. Nesse modelo, as revisões do
projeto são armazenadas em um repositório
central, onde os desenvolvedores obtém suas
cópias de trabalho, e para onde submetem suas
alterações.
O modelo distribuído, por sua vez, vem sendo
popularizado há cerca de uma década. Nesse
modelo, cada desenvolvedor possui seu próprio
repositório local, que armazena parte ou todas as
alterações desde o início do projeto. As alterações
são replicadas entre os diversos repositórios.
Cada modelo possui vantagens e desvantagens.
Modelos
Centralizado (cliente-servidor)
●
Vantagens:
–
–
–
●
Desvantagens:
–
–
Setembro/2008
Controle de acesso
Cópia de segurança
Controle de qualidade
Dependência do repositório central
Ponto único de falha
Juliano F. Ravasi - Sistemas de Controle de Versão
16
O modelo centralizado permite um melhor controle
de quais desenvolvedores acessam quais partes
do projeto. Como todos os desenvolvedores
desenvolvem sobre o mesmo repositório, as cópias
de segurança são mais simples: um único
repositório precisa ser armazenado. O controle de
qualidade pode ser implementado mais facilmente,
através da monitoração e testes automatizados das
alterações do projeto.
Por outro lado, no modelo centralizado, os
desenvolvedores ficam atados ao repositório
central, o que pode ser inconveniente durante
momentos em que o desenvolvedor não possui
acesso a ele (durante uma viagem). É também um
ponto único de falha, sua falta pode atrapalhar toda
a equipe de desenvolvedores.
Modelos
Distribuído
●
Vantagens:
–
–
–
●
Desvantagens:
–
–
Setembro/2008
Permite submissões particulares, offline
Melhor suporte a ramificação e mescla
Independência da rede, mais rápido
Estimula o isolamento de desenvolvedores
Questões de privacidade e segurança
Juliano F. Ravasi - Sistemas de Controle de Versão
17
O modelo distribuído habilita cada desenvolvedor a
ter seu repositório particular, onde suas alterações
são registradas antes de serem compartilhadas
com outros desenvolvedores. Como ramificações e
mesclas ocorrem o tempo todo, VCSes distribuídos
tendem a ter um suporte muito bom para essa
finalidade. Operações de consulta ao histórico não
dependem da rede, portanto muito mais rápidas.
Por outro lado, desenvolvedores tentem a se isolar,
inibindo a revisão e auditoria do resto da equipe.
“Soltar uma bomba” no momento de reintegrar o
desenvolvimento. Para empresas de
desenvolvimento de software proprietário, a idéia
de um desenvolvedor carregar uma cópia completa
do repositório em um laptop, por exemplo, é
assustadora.
Modelos
Centralizado vs. distribuído
●
Assunto “quente” nos últimos anos
–
●
Há sobreposição entre os modelos
–
●
Ferramentas distribuídas podem ser usadas
no modelo centralizado, quando necessário
Ainda não existe a ferramenta perfeita
–
Setembro/2008
Opiniões inflamadas, guerra de egos
Cada modelo de desenvolvimento exige um
modelo de controle de versões
Juliano F. Ravasi - Sistemas de Controle de Versão
18
Controle de versões distribuído é um conceito novo,
seus proponentes tendem a causar guerras de
egos ao dizer que sistemas centralizados são
“inferiores” ou “obsoletos”.
Por outro lado, sistemas centralizados ainda são
dominantes em número de usuários e ferramentas
disponíveis. O número de ferramentas distribuídas
atrapalha a popularização do modelo.
Ferramentas distribuídas podem ser usadas de forma
centralizada, mas a simplicidade das ferramentas
centralizadas parecem influenciar na escolha
quando projetos não precisam ser distribuídos.
Não há uma única resposta para todas as perguntas,
não há calça que sirva a todos, não há uma única
ferramenta perfeita que atenda à todas as
necessidades.
Conceitos
Repositório
●
●
Núcleo do controle de versões
Possui uma “linha do tempo” embutida
–
Setembro/2008
Coletânea de revisões do projeto
Juliano F. Ravasi - Sistemas de Controle de Versão
19
O repositório é o componente principal do sistema
de controle de versões. É o seu núcleo, e é
composto por uma seqüência de revisões
armazenadas ao longo do tempo.
Em geral, o usuário só interage diretamente com o
repositório durante operações de leitura. A escrita
no repositório é realizada por intermédio de outro
componente: a cópia de trabalho.
Conceitos
Repositório
●
Revisão
–
–
Setembro/2008
Estado em um determinado instante
Imutável após criada
Juliano F. Ravasi - Sistemas de Controle de Versão
20
Cada revisão do repositório representa o estado
completo do documento ou projeto em um
determinado instante no tempo. Para softwares,
isso significa que uma revisão contém toda a
árvore de diretórios e os arquivos no estado em
que se encontravam naquele momento.
Sistemas antigos, até o CVS, utilizavam revisões
independentes para cada arquivo. Hoje esse
modelo é obsoleto, em favor dos changesets.
Após criadas, revisões são imutáveis, pois fazem
parte do histórico do projeto. Algumas ferramentas
permitem alterar ou remover revisões antigas, mas
não é um procedimento natural do VCS.
Cada revisão está ligada à sua revisão diretamente
ancestral, e geralmente é armazenada na forma de
um delta.
Conceitos
Cópia de trabalho
●
Cópia do repositório em certa revisão
–
–
Setembro/2008
Geralmente a mais recente
Checkout (obtenção de uma cópia)
Juliano F. Ravasi - Sistemas de Controle de Versão
21
A cópia de trabalho é uma cópia usável do projeto
contido no repositório, em uma determinada
revisão. Por padrão, obtém-se uma cópia de
trabalho da última revisão, pois é sobre ela que o
desenvolvedor prossegue com o desenvolvimento
do projeto.
O processo de obtenção de uma cópia de trabalho é
chamada de checkout.
Conceitos
Cópia de trabalho
●
Onde ocorre o desenvolvimento
–
–
O sistema reconhece as alterações feitas
Algumas operações devem ser explícitas
●
Setembro/2008
Adição, remoção, moção e cópia de arquivos
Juliano F. Ravasi - Sistemas de Controle de Versão
22
Sobre a cópia de trabalho o desenvolvedor realiza as
modificações no projeto, de forma semelhante a
como faria sem o sistema de controle de versões.
O sistema conhece o estado da cópia de trabalho
“pristina”, e através dela é possível reconhecer
onde foram realizadas alterações.
Algumas operações precisam ser informadas
explicitamente ao sistema de controle de versões,
como adição, remoção, moção e cópia de arquivos.
Conceitos
Cópia de trabalho
●
Submissão (commit)
–
Setembro/2008
Alterações são registradas em uma nova
revisão do repositório
Juliano F. Ravasi - Sistemas de Controle de Versão
23
A submissão, ou commit, consiste em registrar o
estado atual da cópia de trabalho, com suas
alterações, devolta ao repositório. Uma nova
revisão é criada como resultado da submissão.
Após a submissão, a cópia de trabalho já é
considerada como sendo derivada da nova revisão,
e o desenvolvedor pode continuar fazendo novas
alterações e novas submissões normalmente.
Conceitos
Ramificações (branches)
●
Linhas alternativas de desenvolvimento
–
–
Setembro/2008
Explícitas
Implícitas
Juliano F. Ravasi - Sistemas de Controle de Versão
24
Ramificações ocorrem quando por um motivo
qualquer, o desenvolvimento do projeto em uma
determinada revisão precisa seguir um rumo
diferente da linha de desenvolvimento principal.
Quando uma ramificação ocorre, duas ou mais
revisões possuem uma única revisão ancestral. O
desenvolvedor pode, portanto, submeter alterações
para qualquer uma das revisões.
Ramificações podem ser explícitas ou implícitas.
Conceitos
Ramificações (branches)
●
Explícitas
–
–
–
Setembro/2008
Manutenção de versões legadas
Implementação de novos recursos
Experiências no código do projeto
Juliano F. Ravasi - Sistemas de Controle de Versão
25
Ramificações explícitas ocorrem quando você
informa ao sistema de controle de versões para
bifurcar a linha de desenvolvimento em
determinado ponto.
Isso é útil para manter versões legadas de software
(por exemplo, lançar uma versão 1.1 do programa
com uma pequena correção em relação à versão
1.0, enquanto o desenvolvimento principal segue
em direção à versão 2.0); implementar novos
recursos que podem causar períodos de
instabilidade no código; ou fazer experiências sem
afetar a linha principal de desenvolvimento.
Conceitos
Ramificações (branches)
●
Implícitas
–
–
Setembro/2008
Cópia de trabalho
Múltiplos desenvolvedores
Juliano F. Ravasi - Sistemas de Controle de Versão
26
Ramificações implícitas ocorrem quando o
desenvolvimento se ramifica de uma forma natural,
sem um procedimento especial junto ao controle de
versões.
Por exemplo, dois ou mais desenvolvedores obtém
cópias de trabalho da mesma última revisão do
repositório, e fazem alterações em suas cópias
simultaneamente. Nesse caso, cada cópia de
trabalho representa uma ramificação implícita, que
o controle de versões não participa até o momento
da submissão.
Conceitos
Mescla (merge)
●
Reintegração de ramificações
–
–
Em grande parte é automatizado
Conflitos podem ocorrer
●
Setembro/2008
O desenvolvedor pode precisar interagir
Juliano F. Ravasi - Sistemas de Controle de Versão
27
A grande utilidade das ramificações depende da
capacidade de poder reintegrar suas alterações
devolta à linha de desenvolvimento principal.
Essa operação é chamada de mescla. Em grande
parte, o controle de versões automatiza essa tarefa
de forma (quase) indolor. Mas podem ocorrer
conflitos, em especial se dois desenvolvedores
alterarem o mesmo trecho do mesmo arquivo.
Quando um conflito ocorre, a operação de mescla,
submissão ou atualização falha, e o controle de
versões pede ao desenvolvedor para resolver o
conflito.
A capacidade de realizar mesclas de forma eficiente
e provadamente correta é um fator que diferencia
os vários sistemas de controle de versões.
Conceitos
Rótulos (tags)
●
Setembro/2008
Nomes atribuídos a revisões
Juliano F. Ravasi - Sistemas de Controle de Versão
28
Rótulos são nomes que o usuário do sistema de
controle de versões pode atribuir a revisões
específicas do controle de versões. Esses nomes
facilitam a consulta e a navegação pelo histórico do
projeto.
Gerenciamento de software
Fluxos de trabalho
●
●
Solitário
Centralizado
–
–
●
Distribuído
–
–
–
Setembro/2008
Repositório local
Repositório remoto
Parceiro
Equipe
Hierárquico
Juliano F. Ravasi - Sistemas de Controle de Versão
29
O controle de versões habilita diferentes formas de
trabalho sobre um projeto de software.
Apesar de ser possível usar qualquer modelo de
controle de versões com qualquer fluxo de
trabalho, naturalmente, um controle de versões
centralizado é mais limitado a fluxos de trabalho
centralizados enquanto que controle de versões
distribuído é mais adequado a fluxos de trabalho
distribuídos.
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Solitário
Juliano F. Ravasi - Sistemas de Controle de Versão
30
Quase todo o projeto de software começa com um
único desenvolvedor em uma única estação de
trabalho.
Nesse caso, só um repositório e só uma cópia de
trabalho são necessários, portanto, ambos os
modelos centralizado e distribuído podem ser
utilizados.
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Centralizado, repositório local
Juliano F. Ravasi - Sistemas de Controle de Versão
31
Durante as décadas de 1970 e 1980, quando ainda
existiam mais pessoas do que computadores, era
uma situação comum vários desenvolvedores
trabalharem juntos ao mesmo computador.
Nesse caso, um único repositório é armazenado
localmente, e acessado por mais de um usuário
local. Quando um segundo desenvolvedor se une
ao projeto, a este é dado acesso ao sistema que
contém o repositório.
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Centralizado, repositório remoto
Juliano F. Ravasi - Sistemas de Controle de Versão
32
Contudo, nos tempos atuais é comum uma única
pessoa possuir diversos computadores. Redes de
computadores interligam esses computadores de
forma quase ubíqua.
Nessa situação, o modelo centralizado exige que um
repositório central seja armazenado em um
computador dedicado, e cada desenvolvedor
obtém uma cópia de trabalho em seu computador
pessoal para desenvolver.
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Distribuído, parceiro
Juliano F. Ravasi - Sistemas de Controle de Versão
33
Outro rumo possível quando um segundo
desenvolvedor se une a um projeto inicialmente
“solitário” é o uso do modelo distribuído.
Nesse caso, não é necessário de um repositório
central. Enquanto apenas dois desenvolvedores
participarem do projeto, só há um caminho para as
alterações de cada desenvolvedor.
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Distribuído, equipe
Juliano F. Ravasi - Sistemas de Controle de Versão
34
Quando o número de desenvolvedores cresce, o
compartilhamento das alterações pode se tornar
um problema. Nesse caso, é comum eleger um
desenvolvedor que será o ponto-de-referência para
os outros desenvolvedores.
É possível também incluir no fluxo de trabalho um
servidor dedicado a compartilhar as alterações
entre os desenvolvedores, fazendo assim o
controle de versões distribuído assumir algumas
características de centralizado.
Gerenciamento de software
Fluxos de trabalho
●
Setembro/2008
Distribuído, hierárquico
Juliano F. Ravasi - Sistemas de Controle de Versão
35
Por fim, o fluxo hierárquico, onde um desenvolvedor
fica no topo de uma hierarquia onde gerencia o
projeto. Esse desenvolvedor também pode ter
acesso exclusivo a um servidor onde os outros
participantes podem obter as alterações.
Geralmente, há dois ou três níveis de hierarquia.
Estes não são os únicos fluxos de trabalho possíveis,
qualquer variação pode ser inventada para atender
às necessidades de cada projeto. Controles de
versões distribuídos oferecem maior flexibilidade
para atender uma maior variedade de fluxos de
trabalho.
Gerenciamento de software
Sistemas de controle de versões
SourceAnyware
Vault
Git
darcs
MOG
ArX
Surround
FtpVC
PlasticSCM
CVS
Store
Stellation
ClearCase
Vesta
AllFusion
codeBeamer
Perforce
SourceSafe
DCVS
GNU arch
CodeVille
Aegis
Setembro/2008
PureCM
Mercurial
RCS
Team Foundation Server
FirePublish
Team Coherence
SourceHaven
MKS
QVCS
Fossil
TeamWare
Code Co-op
AccuRev
Evolution
DesignSync
SVK
Serena
FileHamster
Aldon
AVS
CVSNT
Subversion
OpenCVS
LibreSource
AlienBrain
StarTeam
BitKeeper
Synergy
Juliano F. Ravasi - Sistemas de Controle de Versão
Monotone
Bazaar
36
Uma característica boa dos sistemas de controle de
versões é que há muitos deles para você escolher.
Uma característica ruim dos sistemas de controle de
versões é que há muitos deles para você escolher.
Gerenciamento de software
Sistemas de controle de versões
Centralizado
Aegis
CVSNT
CVS
Aberto
Distribuído
OpenCVS
CodeVille
Stellation
Subversion
ArX arch
Fossil
Vesta
darcs
Git
Bazaar
DCVS
LibreSource
Mercurial Monotone
SVK
AccuRev Aldon AlienBrain AllFusion
Proprietário
AVS
ClearCase
codeBeamer
DesignSync Evolution FileHamster
FirePublish
Perforce
FtpVC
MKS
PureCM QVCS
SourceAnyware
SourceSafe
Code Co-op
MOG
Serena
SourceHaven
StarTeam
BitKeeper
TeamWare
Store
Surround Synergy Team Coherence
Vault
Setembro/2008
PlasticSCM
Team Foundation Server
Juliano F. Ravasi - Sistemas de Controle de Versão
37
Fica mais fácil escolher se os classificarmos em
sistemas centralizados e distribuídos, e em abertos
e proprietários.
Não é interesse dessa palestra falar sobre sistemas
proprietários. Então deixamos essa tarefa aos seus
respectivos consultores de marketing.
Isso nos deixa com um número bem menor de
sistemas de interesse para fazer uma visão geral,
mas ainda muitos para o pouco tempo.
Gerenciamento de software
Sistemas de controle de versões
●
Visão geral dos VCSs abertos:
–
Centralizados:
●
▶
–
▶
●
●
http://subversion.tigris.org/
Git
Mercurial
Bazaar
...
http://git.or.cz/
http://www.selenic.com/mercurial/
http://bazaar-vcs.org/
Mais:
–
–
Setembro/2008
http://www.nongnu.org/cvs/
Distribuídos:
●
●
CVS
Subversion
http://linuxmafia.com/faq/Apps/vcs.html
http://en.wikipedia.org/wiki/List_of_revision_control_software
Juliano F. Ravasi - Sistemas de Controle de Versão
38
Dessa forma, foram eleitos cinco sistemas
considerados os mais populares hoje (setembro de
2008) pelo palestrante para uma visão geral, dois
centralizados (CVS e Subversion) e três
distribuídos (Git, Mercurial e Bazaar).
O palestrante reconhece que vários outros controles
de versões distribuídos mereciam uma menção,
pois contribuíram indiretamente para o avanço
dessa nova ciência, mas é necessário dar um foco
mais prático para não estender demais a
apresentação.
Destes, dois sistemas, Subversion e Mercurial, foram
escolhidos como representantes de suas
categorias para uma demonstração prática do uso
de controle de versões.
Sistemas de controle de versão
CVS
●
●
●
●
●
●
Setembro/2008
Criado para substituir o RCS (1980s)
Obsoleto, desenvolvimento estagnado
Modelo centralizado
Possui grande base de usuários
Possui defeitos e limitações de projeto
Escrito em C, monolítico
Juliano F. Ravasi - Sistemas de Controle de Versão
39
CVS (Concurrent Versions System), apesar de antigo
e largamente considerado obsoleto, ainda é muito
utilizado, especialmente em projetos que existem
desde quando essa era a única opção viável.
Foi desenvolvido na década de 1990, para substituir
o RCS, da década de 1980.
Possui inúmeros defeitos e limitações de projeto.
Muitos desenvolvedores acreditam que usar CVS
causa mais dor e sofrimento do que não usar
qualquer controle de versões.
Sistemas de controle de versão
Subversion
●
“Sucessor” do CVS
–
●
●
●
●
●
●
Setembro/2008
Projetado para contornar os seus defeitos
Desenvolvido por CollabNet Inc.
Modelo centralizado
Robusto e maduro
Ênfase em qualidade, larga escala
Sem restrições a tipos de arquivos
Escrito em C, modular
Juliano F. Ravasi - Sistemas de Controle de Versão
40
Subversion é considerado o sucessor do CVS,
projetado especificamente para contornar seus
defeitos. Possui inúmeras inovações, e grandes
diferenças em relação ao CVS. É hoje o sistema de
controle de versões centralizado mais adotado
para novos projetos.
Possui um projeto sólido, robusto e maduro. Seu
desenvolvimento dá ênfase à qualidade e ao uso
em larga escala. Não impõe restrições quanto aos
tipos de arquivos, gerenciando arquivos binários
tão bem quanto arquivos texto, além de reconhecer
diretórios.
Multiplataforma, suporta Windows nativamente.
Sistemas de controle de versão
Subversion
●
Projeto em camadas
–
Repositório
●
–
Acesso ao repositório
●
–
–
Bindings: C, Python, Perl, Java, Ruby
Cliente
●
Setembro/2008
Local, WebDAV, svnserve
Cópia de trabalho
Biblioteca de cliente
●
–
BorlandDB, fsfs
svn, TortoiseSVN, Subclipse, KDESvn, Trac, ...
Juliano F. Ravasi - Sistemas de Controle de Versão
41
Subversion possui um projeto em camadas, o que
acrescenta à robustez da ferramenta. Repositório,
acesso ao repositório, cópia de trabalho, biblioteca
de cliente e o cliente são todos módulos semiindependentes que se comunicam através de uma
API bem definida e documentada.
Sistemas de controle de versão
Git
●
Criado para gerenciar o kernel do Linux
–
–
●
●
●
●
●
●
Setembro/2008
Após controvérsia sobre o BitKeeper
Inspirado no Monotone
Inicialmente por Linus Torvalds
Modelo distribuído
Ênfase em desenvolvimento não-linear
Autenticação criptográfica do histórico
Gerencia conteúdo, ao invés de arquivos
Escrito em C, monolítico
Juliano F. Ravasi - Sistemas de Controle de Versão
42
Git é um sistema de controle de versões escrito
inicialmente por Linus Torvalds, especificamente
para gerenciar o kernel do Linux.
Segue o modelo distribuído, com uma grande ênfase
em desenvolvimento não-linear. Oferece
autenticação criptográfica do histórico e possui alto
desempenho para as operações mais comuns.
Utiliza um paradigma diferente: gerencia o conteúdo
dos arquivos, deixando os arquivos em si como
entidades secundárias.
Possui uma curva de aprendizado íngreme, impõe
alguns conceitos complexos e confusos. É
considerado difícil de usar, apesar dos avanços em
usabilidade à partir da versão 1.5.
Suporte à plataforma Windows é secundário e
limitado.
Sistemas de controle de versão
Mercurial
●
Criado simultaneamente ao Git
–
●
●
●
●
●
Setembro/2008
Inspirado no Monotone
Desenvolvido por Matt Mackall
Modelo distribuído
Autenticação criptográfica do histórico
Ênfase em uso por grandes projetos
Escrito em Python, modular
Juliano F. Ravasi - Sistemas de Controle de Versão
43
Mercurial foi criado simultaneamente ao Git, com os
propósitos semelhantes, por Matt Mackall.
Como o Git, segue o modelo distribuído e oferece
autenticação criptográfica do histórico.
Ao contrário do Git, não foi projetado para atender
apenas ao desenvolvimento do kernel do Linux,
mas para ser usado por grandes projetos. Possui
um bom desempenho, graças a um projeto de
repositório muito eficiente.
É considerado bem simples de usar, e possui um
conjunto de comandos familiar para usuários de
Subversion.
É portável e bem suportado na plataforma Windows.
Sistemas de controle de versão
Bazaar
●
●
●
Desenvolvido por Canonical Inc.
Modelo distribuído
Ênfase em facilidade, flexibilidade
–
●
●
Setembro/2008
Suporte a múltiplos fluxos de trabalho
Desempenho ruim
Escrito em Python, modular
Juliano F. Ravasi - Sistemas de Controle de Versão
44
Bazaar foi desenvolvido pela Canonical Inc. com
diversas finalidades em mente, entre elas
facilidade, flexibilidade e suporte a fluxos de
trabalho centralizados e distribuídos.
Possui longa história de ancestrais: GNU arch, tla,
baz, Bazaar-NG.
É usado para gerenciar softwares da distribuição
Ubuntu. Oferece um bom suporte à plataforma
Windows, e é considerado bem fácil de usar.
Infelizmente, possui (possuia) sérios problemas de
desempenho. Foi desclassificado na seleção de
dois grandes projetos (Mozilla e OpenSolaris)
devido ao seu péssimo desempenho.
Gerenciamento de software
O que armazenar?
●
Arquivos produzidos pelo desenvolvedor:
✔ código
fonte
✔ scripts de automação
✔ documentação escrita
✔ figuras, imagens e ícones
●
possivelmente apenas os originais, usando ferramentas
automáticas para converter entre formatos e tamanhos
✔ “makefiles”
●
Setembro/2008
a menos que sejam criados por um processo automático
(por ex: ./configure)
Juliano F. Ravasi - Sistemas de Controle de Versão
45
O controle de versões armazena apenas os arquivos
explicitamente indicados pelo desenvolvedor.
Nem todos os arquivos são adequados a serem
armazenados no controle de versões. Em geral,
apenas os arquivos que foram produzidos
manualmente pelo desenvolvedor devem ser
armazenados. Isso inclui: código fonte, scripts de
automação, documentação escrita, figuras,
imagens, e ícones, e “makefiles”.
Gerenciamento de software
O que não armazenar?
●
Arquivos gerados automaticamente:
✘ código-objeto
✘ programas
compilados
✘ documentação automática
●
Arquivos com configurações locais:
✘ credenciais
●
de acesso a banco-de-dados
Arquivos criados acidentalmente:
✘ “core
dumps”
✘ arquivos temporários
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
46
Não se deve armazenar no controle de versões
aqueles arquivos que são gerados por processos
automáticos, como compilação ou conversão de
arquivos fonte. Isso inclui: código-objeto,
programas compilados e documentação
automática (JavaDoc, Doxygen, etc).
Também não se deve armazenar arquivos de
configurações locais ou que deverão ser alterados
pelo usuário final para executar a aplicação, ou
arquivos criados acidentalmente.
Trabalhando com
Subversion
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
Parte 2: Trabalhando com Subversion
●
●
●
●
●
●
●
●
Características gerais
Repositório
Ciclo de trabalho
Comandos
● Consulta de histórico (svn log)
● Atualização (svn update)
● Comparação (svn diff)
● Consulta de estado (svn status)
Ramificações
Mescla e reversão
Rótulos
Propriedades
47
Trabalhando com Subversion
Características gerais
●
Repositório vs. cópia de trabalho
–
●
Ramificações, rótulos
–
–
●
Implícito, parte da árvore do repositório
Criados através de cópias leves
Características únicas:
–
–
–
Setembro/2008
Armazenados em lugares distintos
Propriedades
Diretórios
WebDAV
Juliano F. Ravasi - Sistemas de Controle de Versão
48
Por ser um controle de versões centralizado, o
Subversion armazena o repositório e a cópia de
trabalho em lugares distintos. O mesmo repositório
é usado por todas as cópias de trabalho.
Ramificações e rótulos são gerenciados de forma
implícita, como parte da árvore do repositório. São
criados através de cópias do diretório do projeto
(tronco) para outros diretórios. O Subversion faz
cópias leves, que não consomem espaço adicional.
A distinção entre tronco, ramificações e rótulos é
feita pelo usuário.
Algumas das características únicas do Subversion
são: suporte a propriedades, controle de diretórios
e WebDAV.
Trabalhando com Subversion
Características gerais
●
Recomendação
–
●
Usar versão 1.5 ou superior.
Informações
–
–
–
Projeto: http://subversion.tigris.org/
Manual: http://svnbook.red-bean.com/
Clientes:
●
●
●
Setembro/2008
Windows: http://tortoisesvn.tigris.org/
Eclipse: http://subclipse.tigris.org/
KDE: http://kdesvn.alwins-world.de/
Juliano F. Ravasi - Sistemas de Controle de Versão
49
A versão 1.5 do Subversion implementa diversos
novos recursos, em especial o suporte mais
avançado a mesclas.
O manual do Subversion é leitura obrigatória a todos
os usuários. Todas as informações necessárias
para o uso da ferramenta podem ser encontradas
no manual.
Trabalhando com Subversion
Repositório
●
Sistema de arquivos
–
Baseado em ligações
●
●
–
Revisões numéricas, seriais
●
●
Revisão zero: repositório em branco
Sugestões de organização:
–
Setembro/2008
Cópias leves, copy-on-write
Banco-de-dados transacional
Um repositório por projeto
(incluindo subprojetos)
Juliano F. Ravasi - Sistemas de Controle de Versão
50
O repositório Subversion é um sistema de arquivos
baseado em ligações, onde cada revisão aumenta
ao tamanho do repositório apenas as alterações
em relação à revisão anterior. Cópias de arquivos e
diretórios dentro do repositório são leves, rápidas e
não consomem espaço adicional. O repositório é
implementado na forma de um banco-de-dados
transacional: ou a nova revisão ocorre por
completo, ou ela simplesmente não ocorre.
Cada revisão no repositório é identificada por um
número seqüencial, onde a primeira revisão, com o
repositório vazio, é a revisão zero.
O repositório pode ser organizado de acordo com as
necessidades do usuário. Uma boa sugestão é
armazenar um projeto (incluindo possíveis
subprojetos) para cada repositório.
Trabalhando com Subversion
Repositório
●
Criação do repositório
–
svnadmin create diretório
●
●
Cria um novo repositório Subversion em branco
(revisão zero) em ‘diretório’.
Convenções de hierarquia
/
trunk/
branches/
tags/
Setembro/2008
← tronco
← ramificações
← rótulos
Juliano F. Ravasi - Sistemas de Controle de Versão
51
Para se criar um novo repositório Subversion, utilizase o comando svnadmin. O repositório é
armazenado sob uma árvore de diretórios no
sistema de arquivos do usuário. Qualquer pessoa
com acesso de leitura (e escrita) a este diretório
pode recuperar seu conteúdo (e gravar novas
revisões).
«Demonstração: criação do repositório»
Dentro do repositório, é necessário criar divisões
para organizar o projeto. É importante adotar uma
convenção de hierarquia que separará o tronco do
desenvolvimento das ramificações e dos rótulos.
Trabalhando com Subversion
Repositório
●
Setembro/2008
Convenções de hierarquia
Juliano F. Ravasi - Sistemas de Controle de Versão
52
A hierarquia do repositório pode variar de acordo
com as necessidades do usuário.
No primeiro exemplo, apenas um projeto é
armazenado no repositório, em trunk, com
ramificações armazenadas em branches e rótulos
armazenados em tags.
No segundo exemplo, o projeto é composto por
vários subprojetos. No primeiro nível de diretórios
sob a raiz estão os diretórios para tronco,
ramificações e rótulos, e no segundo nível há
divisões para cada projeto.
No terceiro exemplo, o projeto também é composto
por vários subprojetos, mas cada projeto é
colocado no primeiro nível de diretórios sob a raiz,
cada um com seus diretórios de tronco,
ramificações e rótulos.
Trabalhando com Subversion
Repositório
●
Criação da hierarquia inicial
–
Método 1:
svn checkout file:///home/user/svn/repo
cd repo
svn mkdir trunk branches tags
svn commit -m "Directory hierarchy."
–
Método 2 (bash):
r=file:///home/user/svn/repo
svn mkdir $r/{trunk,branches,tags} -m "..."
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
53
Ao ser criado, o repositório estará vazio, na revisão
zero. Antes de começar a usar o repositório, é uma
boa idéia criar a hierarquia de diretórios do
repositório. Nesse caso vamos criamos uma
estrutura simples para um único projeto.
Isso é feito obtendo uma cópia de trabalho da raiz do
repositório (svn checkout), criando os diretórios
(svn mkdir), e submetendo a primeira revisão do
projeto devolta ao repositório (svn commit). Após
isso podemos descartar essa cópia de trabalho.
Uma segunda alternativa é criar a hierarquia de
diretórios diretamente sobre o repositório,
passando as URLs completas para o comando svn
mkdir. Aqui é mostrado também uma simplificação
do comando usando recursos do shell.
«Demonstração: hierarquia inicial»
Trabalhando com Subversion
Ciclo de trabalho
●
1. Obtenção (checkout)
–
svn checkout
❶ svn checkout
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
54
O ciclo básico de trabalho com o Subversion é
composto de cinco passos.
Primeiramente, obtém-se uma cópia de trabalho local
do repositório através do comando svn checkout. A
cópia local contém toda a hierarquia de arquivos e
diretórios da última revisão (opcionalmente: uma
determinada revisão) do projeto no repositório no
endereço fornecido.
A cópia de trabalho mantém, além dos arquivos do
projeto, informações sobre o estado do projeto, a
revisão obtida e o caminho do repositório.
Trabalhando com Subversion
Ciclo de trabalho
●
2. Desenvolvimento
❷ (edição)
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
55
Após obter uma cópia de trabalho do projeto, o
usuário desenvolve sobre este da forma como faz
usualmente. Não é necessário se comunicar com o
repositório durante o desenvolvimento.
Trabalhando com Subversion
Ciclo de trabalho
●
3. Comparação, reversão
–
–
–
svn status
svn diff
svn revert
❸ svn diff
svn revert
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
56
Após alterar os arquivos da cópia de trabalho, esta
terá seu estado marcado como “alterada”. Isso
significa que há alterações locais que não estão
armazenadas no repositório ainda.
O usuário pode consultar as alterações feitas ao
projeto, e opcionalmente reverter quaisquer
alterações incorretas.
Esses procedimentos não fazem acesso ao
repositório.
Trabalhando com Subversion
Ciclo de trabalho
●
4. Submissão
–
svn commit
❹ svn commit
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
57
Quando o desenvolvedor achar que suas alterações
estão adequadas, este as submete devolta ao
repositório.
Ao submeter ao repositório, uma nova revisão é
criada, e a cópia de trabalho é atualizada para a
nova revisão, e também seu estado se torna
“limpo”, ou seja, a cópia de trabalho mais uma vez
volta a representar a última revisão do projeto no
repositório.
Trabalhando com Subversion
Ciclo de trabalho
●
5. Atualização
–
svn update
❺ svn update
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
58
Outros desenvolvedores utilizando o mesmo
repositório podem também ter submetido suas
alterações. O usuário pode receber essas
alterações em sua cópia de trabalho fazendo uma
atualização.
Durante o desenvolvimento paralelo, é possível que
seja necessário atualizar a cópia de trabalho antes
de submeter ao repositório. Nesse processo
podem ocorrer conflitos entre as alterações locais e
as alterações realizadas pelos outros
desenvolvedores.
Trabalhando com Subversion
Comandos
●
Ferramentas principais:
–
svn
●
–
svnadmin
●
●
Manutenção do repositório.
Outras ferramentas:
–
–
–
–
Setembro/2008
Cliente padrão, cópia de trabalho.
svndumpfilter
svnlook
svnserve
svnsync
Juliano F. Ravasi - Sistemas de Controle de Versão
59
O Subversion fornece alguns programas executáveis
que o desenvolvedor utiliza para interagir com a
cópia de trabalho e o repositório.
Os principais comandos são o cliente padrão, svn, e
a ferramenta de manutenção do repositório,
svnadmin. Outros ferramentas são fornecidas, mas
são de importância secundária.
Trabalhando com Subversion
Comandos
●
Acesso ao repositório
–
Local
●
–
WebDAV sobre HTTP
●
●
–
svn://svn.example.com/svn/repo/...
svnserve sobre SSH
●
Setembro/2008
http://svn.example.com/svn/repo/...
https://svn.example.com/svn/repo/...
svnserve
●
–
file:///home/user/svn/repo/...
svn+ssh://svn.example.com/svn/repo/...
Juliano F. Ravasi - Sistemas de Controle de Versão
60
O repositório pode ser acessado de pelo menos
quatro formas diferentes (outras formas podem ser
criadas pelo usuário). Cada forma de acesso é
representada pelo esquema do endereço passado
para os comandos.
Para acesso a um repositório local, hospedado na
mesma máquina, é utilizado o esquema file://.
Repositórios remotos podem ser acessados via
HTTP, através do protocolo WebDAV, via um
protocolo próprio (svnserve), ou via SSH se o
usuário possuir um login shell no servidor remoto.
Trabalhando com Subversion
Comandos
●
Acesso ao repositório
–
Composição da URL
svn://svn.example.com/svn/project/subproject/trunk/
Endereço do
servidor Subversion
Setembro/2008
Endereço do
repositório
Caminho armazenado
no repositório
Juliano F. Ravasi - Sistemas de Controle de Versão
61
É possível trabalhar apenas sobre uma parte do
projeto, fornecendo o caminho completo do
diretório desejado ao comando svn.
Na verdade, normalmente se obtém apenas o
diretório trunk do projeto que você quer trabalhar.
Trabalhando com Subversion
Comandos
●
Importação
–
svn import [diretório] URL
●
●
Obtenção
–
svn checkout URL [diretório]
●
–
–
Obtém uma cópia de trabalho.
svn export URL [diretório]
●
Obtém uma cópia limpa do projeto.
svn update [diretório]
●
Setembro/2008
Importa um projeto existente em um repositório.
Atualiza a cópia de trabalho com o repositório.
Juliano F. Ravasi - Sistemas de Controle de Versão
62
É possível importar um projeto pré-existente
diretamente para o repositório, através do
comando svn import.
Para se obter uma cópia de trabalho, utiliza-se o
comando svn checkout, fornecendo o endereço do
projeto no repositório e (opcionalmente) o diretório
para onde será copiado. Por padrão, a última
revisão do projeto é obtida.
O comando svn export é semelhante ao checkout,
exceto que a cópia obtida é limpa, sem controle de
versões (adequada para empacotamento).
O comando svn update é utilizado para atualizar uma
cópia de trabalho já existente para a última revisão
armazenada no repositório.
«Demonstração: obtenção da cópia de trabalho»
Trabalhando com Subversion
Comandos
●
Edição
–
svn add alvo
●
–
svn delete alvo
●
–
Cria uma cópia de um arquivo ou diretório.
svn move orig dest
●
Setembro/2008
Cria um diretório no controle de versão.
svn copy orig dest
●
–
Remove um arq./dir. do controle de versão.
svn mkdir diretório
●
–
Adiciona um arq./dir. ao controle de versão.
Move ou renomeia um arquivo ou diretório.
Juliano F. Ravasi - Sistemas de Controle de Versão
63
A edição de arquivos pode ser feita livremente sobre
os arquivos da cópia de trabalho. Subversion
reconhece as alterações automaticamente.
Contudo, para outras operações, como adicionar,
remover, copiar ou mover arquivos, é necessário
informar explicitamente.
«Demonstração: edição, adição, remoção»
Trabalhando com Subversion
Comandos
●
Consulta e comparação
–
svn status [alvo]
●
–
svn diff [alvo]
●
●
Mostra alterações realizadas em arquivos.
Reversão
–
svn revert [alvo]
●
Setembro/2008
Mostra arquivos alterados, adicionados, etc.
Reverte alterações realizadas em arquivos.
Juliano F. Ravasi - Sistemas de Controle de Versão
64
Após a edição, verifica-se quais alterações foram
reconhecidas pelo Subversion (e portanto serão
submetidas ao repositório mais adiante).
É possível também reverter alterações acidentais.
«Demonstração: consulta, reversão»
Trabalhando com Subversion
Comandos
●
Submissão
–
svn update
●
●
–
svn commit [alvo]
●
●
Setembro/2008
Atualiza a cópia de trabalho antes de submeter,
opcional.
Podem ocorrer conflitos ao mesclar as
alterações do repositório com as suas.
Submete o estado atual da cópia de trabalho
para o repositório, criando uma nova revisão.
Nesse processo, é necessário fornecer uma
breve descrição das alterações realizadas.
Juliano F. Ravasi - Sistemas de Controle de Versão
65
Antes de submeter, podemos atualizar a cópia de
trabalho novamente, para obter as alterações
realizadas por outros desenvolvedores enquanto
estávamos a realizar as nossas. Isso garante que o
repositório irá aceitar nossa submissão, pois ela irá
adicionar de forma limpa ao final da linha de
revisões.
Por fim, registramos nossas alterações submetendo
ao repositório. Podemos submeter todas as
alterações como uma única revisão, ou
seletivamente partes da cópia de trabalho,
repetindo o comando diversas vezes (criando
diversas revisões separadas).
«Demonstração: submissão»
Trabalhando com Subversion
Comandos
●
Resolução de conflitos
–
svn resolve --accept arg [alvo]
●
–
svn resolved alvo
●
–
–
Informa que o conflito foi manualmente
resolvido, e destrava a cópia de trabalho.
svn status
svn commit [alvo]
●
Setembro/2008
Resolução simples, informa qual versão do alvo
deverá ser preservada.
Após resolver os conflitos, tentar submeter
novamente.
Juliano F. Ravasi - Sistemas de Controle de Versão
66
Se durante a nossa edição, outro desenvolvedor
submeter alterações para os mesmos arquivos,
ocorrerá colisões.
O Subversion irá se esforçar para mesclar
automaticamente as alterações para nós, mas se
ocorreram alterações na mesma região de algum
arquivo, um conflito ocorrerá.
Nesse caso, o Subversion irá solicitar a mescla
manual do conflito. Após resolver o conflito,
informamos que a resolução foi concluída, e então
será possível continuar com a submissão.
«Demonstração: resolução de conflitos»
Trabalhando com Subversion
Comandos
●
Informação e auditoria
–
svn info [alvo]
●
–
svn log [alvo]
●
–
Mostra registro de alterações de um arquivo,
diretório ou do projeto.
svn blame arquivo
●
Setembro/2008
Mostra informações diversas sobre a cópia de
trabalho ou o alvo fornecido.
Acusa os desenvolvedores que alteraram por
último cada linha de um arquivo.
Juliano F. Ravasi - Sistemas de Controle de Versão
67
O grande poder de um VCS é a capacidade de rever
e analisar o histórico passado do projeto. O
Subversion oferece diversos comandos para essa
finalidade.
«Demonstração: informações e auditoria»
Trabalhando com Subversion
Consulta de histórico (svn log)
r3 | juliano | 2008-07-18 00:41:18 -0300 (Fri, 18 Jul 2008) | 8 lines
Changed paths:
M /trunk
A /trunk/CalculatorForm.cpp
A /trunk/CalculatorForm.h
A /trunk/CalculatorForm.ui
M /trunk/calculator.cpp
M /trunk/calculator.pro
User interface design.
Designed the user interface of the calculator, using Qt Designer.
No functions have been implemented yet. The calculator is
non-functional.
Added some patterns for generated files to svn:ignore.
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
68
O comando svn log mostra o histórico de revisões do
projeto, das revisões mais recentes para as mais
antigas (por padrão). Para cada revisão, são
listadas suas informações fundamentais: quem,
quando e o que foi alterado, e por que a alteração
foi feita.
Trabalhando com Subversion
Atualização (svn update)
●
Para visitar revisões passadas
–
–
●
Para retornar à última revisão
–
●
svn update
Legenda
–
–
–
–
–
–
Setembro/2008
svn update -r revisão
svn update -r {data}
A:
D:
U:
C:
G:
E:
adicionado
apagado
atualizado
conflito
mesclado
já existente
(Added)
(Deleted)
(Updated)
(Conflicted)
(merGed)
(Existed)
Juliano F. Ravasi - Sistemas de Controle de Versão
69
O comando svn update pode ser utilizado para visitar
revisões anteriores do projeto. Para isso, basta
fornecer o número da revisão ou a data para a qual
se deseja “viajar”.
Note que não é possível submeter alterações para
revisões antigas, a menos que se crie ramificações
para isso.
Para retornar à revisão mais atual, basta utilizar svn
update sem argumentos.
«Demonstração: viagem no histórico»
Trabalhando com Subversion
Comparação (svn diff)
●
Alterações na cópia de trabalho
–
●
svn diff [alvo]
Comparar revisões arbitrárias
–
svn diff -r x:y [alvo]
●
–
svn diff -c x [alvo]
●
Setembro/2008
Alterações entre revisões ‘x’ e ‘y’.
Alterações entre revisões ‘x’-1 e ‘x’.
Juliano F. Ravasi - Sistemas de Controle de Versão
70
O comando svn diff é utilizado para comparar
arquivos, tanto em relação às alterações ocorridas
na cópia de trabalho (que ainda não foram
submetidas), quanto em relação às alterações
ocorridas entre duas revisões quaisquer do projeto.
«Demonstração: comparação»
Trabalhando com Subversion
Comparação (svn diff)
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
71
A saída do comando svn diff é a mesma do comando
Unix padrão diff, no formato unificado. Nesse
formato, cada arquivo alterado é relatado por
alguns cabeçalhos, seguido dos trechos que foram
alterados. Para cada trecho, linhas removidas são
denotadas com o caractere ‘-’, e linhas adicionadas
são denotadas com o caractere ‘+’.
A saída do comando pode ser gravada em um
arquivo, e subseqüentemente passada para o
comando patch, que é capaz de refazer ou
desfazer as alterações indicadas automaticamente,
dado um conjunto de arquivos compatível.
A saída também pode ser enviada para outras
ferramentas que ajudam a visualização das
alterações (ex: diffstat, kompare).
Trabalhando com Subversion
Consulta de estado (svn status)
●
Legenda
–
–
–
–
–
–
–
–
–
●
adicionado
(Added)
em conflito
(Conflicted)
apagado
(Deleted)
ignorado
(Ignored)
modificado
(Modified)
substituído
(Replaced)
item externo
(eXternal)
item desconhecido, não controlado
item controlado, porém ausente
Mais detalhes
–
Setembro/2008
A:
C:
D:
I:
M:
R:
X:
?:
!:
svn help status
Juliano F. Ravasi - Sistemas de Controle de Versão
72
O comando svn status mostra o estado atual da
cópia de trabalho em relação à revisão base, um
resumo das alterações realizadas na cópia de
trabalho.
A arquivo que não esteja no seu estado “limpo” é
listado, acompanhado de indicadores do estado do
arquivo em relação à sua referência na revisão
base do repositório.
Trabalhando com Subversion
Ramificações
●
Comandos
–
svn copy repo/trunk
repo/branches/branch
●
–
–
svn switch repo/trunk
svn switch repo/branch/branch
●
Setembro/2008
Cria uma nova ramificação.
Alterna entre ramificações.
Juliano F. Ravasi - Sistemas de Controle de Versão
73
No Subversion, ramificações são criadas criando-se
cópias do tronco ou de outras ramificações. O
comando svn copy, nesse caso, é usado
diretamente sobre o repositório, e portanto, causa
a criação de uma nova revisão.
A cópia de trabalho pode alternar de uma ramificação
para outra através do comando svn switch,
passando-se o endereço completo da ramificação
para a qual deseja-se alternar.
«Demonstração: ramificações»
Trabalhando com Subversion
Mescla e reversão
●
Mescla entre ramificações
–
svn merge URL
●
–
svn merge --reintegrate URL
●
–
Reintegra alterações de uma ramificação ao
tronco.
svn merge -c rev URL
●
Setembro/2008
Mescla alterações de uma ramificação diferente
na ramificação atual da cópia de trabalho.
Mescla apenas revisão ‘rev’.
Juliano F. Ravasi - Sistemas de Controle de Versão
74
As ramificações divergem o desenvolvimento do
projeto em diferentes direções. Ramificações de
recursos devem se manter em dia com o
desenvolvimento principal, e devem em dado
momento ser reintegradas ao tronco do projeto.
O comando svn merge mescla as alterações da
ramificação indicada à cópia de trabalho (para
serem testadas e então submetidas como parte da
ramificação corrente). É possível mesclar
automaticamente todas as revisões pendentes
(desde a ramificação ou a última mescla), ou
selecionar determinadas revisões.
Para ramificações de recursos, estas devem ser
reintegradas à linha de desenvolvimento originária
através de um parâmetro especial.
«Demonstração: mescla»
Trabalhando com Subversion
Mescla e reversão
●
Reversão
–
svn merge -c -rev URL
●
●
●
Setembro/2008
Desfaz as alterações da revisão ‘rev’.
Pode ser usado na própria ramificação.
É uma mescla “ao contrário”.
Juliano F. Ravasi - Sistemas de Controle de Versão
75
O comando svn merge também pode ser utilizado
para reverter uma revisão anteriormente submetida
(que pode, por exemplo, ter introduzido um bug ao
projeto). O princípio é exatamente o mesmo da
mescla comum, só que aplicado de forma inversa
(negativa) e geralmente dentro da mesma
ramificação.
Trabalhando com Subversion
Rótulos
●
Caso especial de ramificação
–
–
●
São usados apenas como referência
Devem ser “somente-leitura” após criados.
Comando
–
svn copy repo/trunk
repo/tags/tag
●
Setembro/2008
Cria um novo rótulo.
Juliano F. Ravasi - Sistemas de Controle de Versão
76
Rótulos são criados da mesma forma que as
ramificações, mas em um diretório diferente do
repositório.
A diferença entre ramificações e rótulos para o
Subversion é estritamente semântica, e aplicada
pelo usuário. Convenciona-se que o diretório /tags/
do repositório deve receber apenas rótulos.
O administrador do repositório Subversion pode criar
algumas regras que protegem o diretório /tags/ de
submissões acidentais.
«Demonstração: rótulos»
Trabalhando com Subversion
Propriedades
●
Comandos
–
svn proplist [alvo]
●
–
svn propget prop alvo
●
–
Altera uma propriedade (no editor externo).
svn propdel prop alvo
●
Setembro/2008
Configura o conteúdo de uma propriedade.
svn propedit prop alvo
●
–
Recupera conteúdo de uma propriedade.
svn propset prop cont alvo
●
–
Lista propriedades.
Apaga uma propriedade.
Juliano F. Ravasi - Sistemas de Controle de Versão
77
Um recurso único do Subversion é o suporte a
propriedades. Propriedades são tuplas (chave,
valor) que podem ser associadas a objetos
(diretórios e arquivos) ou revisões.
Propriedades oferecem uma forma elegante de
armazenar informações adicionais sobre objetos.
Elas são utilizadas primariamente para armazenar
informações do controle de versões, mas podem
ser utilizadas pelo usuário para armazenar outras
meta-informações que achar conveniente.
Trabalhando com Subversion
Propriedades
●
Propriedades padrão
–
Diretórios e arquivos
●
●
●
●
●
●
●
–
Revisões
●
●
●
Setembro/2008
svn:eol-style
svn:executable
svn:externals
svn:ignore
svn:keywords
svn:mime-type
svn:needs-lock
svn:author
svn:date
svn:log
Juliano F. Ravasi - Sistemas de Controle de Versão
78
Propriedades são usadas, por exemplo, para definir
quais arquivos não devem ser monitorados pelo
controle de versões (svn:ignore), realizar
conversões especiais no conteúdo dos arquivos
(svn:eol-style, svn:keywords), ou importar diversos
projetos distintos em uma única hierarquia
(svn:externals).
Trabalhando com
Mercurial
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
Parte 3: Trabalhando com Mercurial
●
●
●
●
●
●
●
●
Características gerais
Repositório
Ciclo de trabalho
Grafo de revisões
Comandos
● Criação e clonagem
Trabalho distribuído
Ramificações
Rótulos
79
Trabalhando com Mercurial
Características gerais
●
Distribuído
–
●
Ramificações, rótulos
–
–
Setembro/2008
Cópia de trabalho contém o repositório:
São armazenados juntos
Explícitos, possuem tratamento especial
Cada cópia de trabalho é uma ramificação
Juliano F. Ravasi - Sistemas de Controle de Versão
80
Mercurial é um sistema de controle de versões
distribuído, projetado especificamente para
gerenciamento de software. Portanto, cada
desenvolvedor ou usuário deve ter sua cópia local
do repositório.
O repositório local é armazenado juntamente à cópia
de trabalho, para a conveniência do usuário.
Ao contrário do Subversion, ramificações e rótulos
são objetos gerenciados explicitamente pelo
controle de versões, com comandos dedicados.
Cada cópia de trabalho (que inclui o repositório) é
automaticamente uma ramificação implícita do
projeto.
Trabalhando com Mercurial
Características gerais
●
Informações
–
–
–
Projeto: http://www.selenic.com/mercurial/
Manual: http://hgbook.red-bean.com/
Clientes:
●
●
Setembro/2008
Windows: http://tortoisehg.sourceforge.net/
Eclipse:
http://www.vectrace.com/mercurialeclipse/
Juliano F. Ravasi - Sistemas de Controle de Versão
81
A versão atual (em Set/2008) do Mercurial é 1.0.2. A
página do projeto contém uma grande quantidade
de informações úteis, incluindo tutoriais e guias de
referência.
O manual (hgbook) está ligeiramente obsoleto e
requer alguma atualização, mas ainda é um bom
ponto-de-referência para aprender a utilizar.
Trabalhando com Mercurial
Repositório
●
Sistema de arquivos
–
–
Armazenamento eficiente, seguro e rápido
Revisões:
●
●
●
Sugestões de organização:
–
–
Setembro/2008
Numéricas, seriais
Hash SHA-1 do changeset
Um repositório por subprojeto
Projeto: vários subprojetos agrupados
Juliano F. Ravasi - Sistemas de Controle de Versão
82
Uma característica importante do Mercurial é o seu
repositório, projetado para ter um armazenamento
muito eficiente, seguro e rápido.
As revisões são compostas de dois identificadores
distintos: um número serial particular do
repositório, que inicia na revisão zero (primeiro
commit), e um hash SHA-1 do changeset global
(igual para todos os repositórios do mesmo
projeto).
Como há menos liberdade de organização do
conteúdo do repositório, é sugerido que se tenha
um repositório para cada subprojeto, usando
opcionalmente uma “floresta” (forest) para agrupar
diversos subprojetos.
Trabalhando com Mercurial
Ciclo de trabalho
●
1. Início do projeto (init)
–
hg init
➊ hg init
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
83
O ciclo básico de trabalho com Mercurial começa ao
dar a partida no projeto.
A configuração inicial do projeto é muito mais simples
do que com Subversion; o repositório é construído
e inicializado automaticamente sob o diretório
corrente, e o usuário já pode começar a trabalhar
sobre o projeto sem maiores preocupações.
Trabalhando com Mercurial
Ciclo de trabalho
●
2. Desenvolvimento, submissão local
–
hg status, diff, revert, commit
➋ hg
hg
hg
hg
Setembro/2008
status
diff
revert
commit
Juliano F. Ravasi - Sistemas de Controle de Versão
84
O usuário pode trabalhar e submeter ao seu
repositório local da mesma forma como faria com
Subversion.
Submissões (commit) são sempre locais, ou seja,
registradas em seu repositório local e particular
apenas. Outros comandos são utilizados para
compartilhar suas submissões com outros
usuários.
Trabalhando com Mercurial
Ciclo de trabalho
●
3. Ramificação
–
hg clone
➌ hg clone
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
85
Quando um segundo desenvolvedor se junta ao
projeto, este deve clonar o repositório já existente
do primeiro desenvolvedor, criando assim sua
ramificação particular do projeto.
Trabalhando com Mercurial
Ciclo de trabalho
●
4. Mais desenvolvimento
➍ hg
hg
hg
hg
Setembro/2008
status
diff
revert
commit
➍ hg
hg
hg
hg
Juliano F. Ravasi - Sistemas de Controle de Versão
status
diff
revert
commit
86
Cada desenvolvedor continua a trabalhar sobre o
seu repositório particular.
Trabalhando com Mercurial
Ciclo de trabalho
●
5. Mescla
–
hg pull, push
➎ hg pull
hg push
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
87
Em determinado momento, os desenvolvedores
decidem compartilhar suas submissões, de forma a
unificar (mesclar) as alterações de cada um.
Essas operações são chamadas de empurrar (push)
e puxar (pull) submissões.
Trabalhando com Mercurial
Ciclo de trabalho
Setembro/2008
hg pull
hg pull
hg pull
hg pull
Juliano F. Ravasi - Sistemas de Controle de Versão
88
Quando muitos desenvolvedores trabalham sobre o
mesmo projeto, cada um deve puxar as alterações
dos outros.
Trabalhando com Mercurial
Ciclo de trabalho
hg pull
hg pull
hg pull
hg pull
hg push
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
89
Uma abordagem centralizada pode ser utilizada
quando necessária. Nesse cenário, quando um
desenvolvedor deseja compartilhar alterações com
outros desenvolvedores (equivalente ao commit do
Subversion), este empurra suas submissões para
um servidor dedicado, de onde os outros
desenvolvedores podem puxar (equivalente ao
update do Subversion).
Trabalhando com Mercurial
Ciclo de trabalho
hg import
hg import
hg import
hg import
hg export
lista de e-mails
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
90
Se um servidor dedicado não estiver disponível, uma
lista de e-mails onde todos os desenvolvedores
participam pode ser utilizada.
Nesse cenário, o desenvolvedor exporta suas
submissões para a lista de e-mails, e cada outro
desenvolvedor importa as submissões para seus
repositórios locais.
Trabalhando com Mercurial
Ciclo de trabalho
Mercurial
Subversion
(distribuído)
(centralizado)
1
*
Remoto
push
pull
Local
1
update
commit
update
commit
1
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
*
91
O ponto-de-vista distribuído, adotado pelo Mercurial,
é centrado na cópia de trabalho local do usuário,
no sentido de que o usuário enxerga a sua cópia
de trabalho, com seu repositório local, lidando com
diversos outros repositórios externos.
O ponto-de-vista centralizado, adotado pelo
Subversion, é centrado no repositório, no sentido
de que o usuário enxerga o repositório como único,
sendo a sua cópia de trabalho uma entre muitas
que lidam diretamente com o repositório.
Comparativamente, o Mercurial recupera alterações
de outros desenvolvedores através de duas etapas
(pull+update) que equivalem a uma etapa do
Subversion (update); e envia alterações também
através de duas etapas (commit+push) que
equivalem a uma do Subversion (commit).
Trabalhando com Mercurial
Grafo de revisões
tip
3: 3a63
2: ecf3
Setembro/2008
0: 9117
Bob
Alice
1: 273c
Juliano F. Ravasi - Sistemas de Controle de Versão
92
As revisões em um repositório Mercurial (igualmente
para Git, Bazaar e outros VCSes distribuídos) são
representadas por grafos acíclicos dirigidos
(DAG: Directed Acyclic Graph). Isso significa que
há uma relação de hierarquia entre revisões, e não
há caminhos que levam de uma revisão à ela
mesma.
Cada revisão possui como ascendente a revisão
sobre a qual alterações foram feitas e cuja
submissão gerou tal revisão. Um caso especial é a
revisão inicial, que não possui ascendentes.
Mercurial chama de “ponta” (tip) a revisão mais
recente do repositório.
Trabalhando com Mercurial
Grafo de revisões
tip
tip
3: 3a63
3: 3a63
2: ecf3
2: ecf3
Setembro/2008
0: 9117
1: 273c
hg clone
Bob
Alice
1: 273c
0: 9117
Juliano F. Ravasi - Sistemas de Controle de Versão
93
A clonagem consiste em fazer uma cópia de todas as
revisões do repositório de origem para um novo
repositório.
Nesta ilustração, Bob clona o repositório de Alice.
Após a clonagem, ambos os repositórios são
virtualmente idênticos, e independentes. A única
diferença entre os repositórios é que o clone
mantém uma referência ao seu repositório de
origem, eliminando a necessidade de fornecer
novamente seu endereço em futuros comandos de
replicação.
Trabalhando com Mercurial
Setembro/2008
tip
tip
5: 5f24
5: 5102
4: ce3b
4: 207f
3: 3a63
3: 3a63
2: ecf3
2: ecf3
1: 273c
1: 273c
0: 9117
Bob
Alice
Grafo de revisões
0: 9117
Juliano F. Ravasi - Sistemas de Controle de Versão
94
Alice e Bob continuam trabalhando cada um em sua
cópia do repositório do projeto, cada um em sua
ramificação particular, divergindo do histórico em
comum.
Trabalhando com Mercurial
Grafo de revisões
tip
7: 5f24
6: ce3b
tip
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
hg pull
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
95
Em determinado momento Bob resolve trazer (puxar)
as alterações de Alice para o seu repositório. Mas
as submissões de Alice são descendentes da
última revisão em comum entre os dois
repositórios. Isso criará uma ramificação no
repositório de Bob.
Neste momento, haverá duas “cabeças” (heads) no
repositório de Bob. Cabeças são revisões sem
descendentes. Toda cabeça é uma ramificação
implícita do projeto.
A cópia de trabalho continua na revisão original antes
de puxar as submissões de Alice. O comando
update irá falhar, pois não há ainda um caminho
direto da revisão corrente (5) para a ponta (7).
Trabalhando com Mercurial
Grafo de revisões
merge
hg merge
tip
7: 5f24
tip
6: ce3b
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
96
Bob mescla a cabeça recém obtida ao puxar as
submissões de Alice em sua cópia de trabalho
(originalmente ligada à revisão 5 nesta ilustração).
A cópia de trabalho terá então duas revisões
ascendentes, e conterá tanto as alterações da
ramificação de Bob (3→4→5) quanto as de Alice
(3→6→7).
Note que as revisões obtidas de Alice possuem
identificadores seriais diferentes no repositório de
Bob, mas os mesmos identificadores SHA-1.
Trabalhando com Mercurial
Grafo de revisões
tip
8: b4d0
7: 5f24
tip
6: ce3b
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
3: 3a63
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
97
Bob então submete sua mescla para seu repositório
local, criando uma nova revisão que converge as
duas ramificações novamente em uma única
cabeça, que também é a nova ponta do repositório.
Trabalhando com Mercurial
Grafo de revisões
tip
tip
8: b4d0
8: b4d0
7: 5102
7: 5f24
6: 207f
6: ce3b
5: 5f24
5: 5102
4: ce3b
4: 207f
Setembro/2008
2: ecf3
hg pull (alice)
hg push (bob)
3: 3a63
Bob
Alice
3: 3a63
2: ecf3
Juliano F. Ravasi - Sistemas de Controle de Versão
98
Se Bob tiver permissão de escrita ao repositório de
Alice, ele poderá empurrar suas novas submissões,
incluindo sua mescla das duas ramificações. Caso
contrário, Alice pode puxar as submissões de Bob
para seu repositório, o efeito é idêntico.
Note que a cópia de trabalho de Alice continuará na
revisão original antes da sincronização. Alice
precisa atualizar sua cópia de trabalho para a
ponta do repositório (hg update) para ver as
alterações trazidas do repositório de Bob.
Trabalhando com Mercurial
Comandos
●
Comandos comuns
–
–
–
–
–
–
–
–
–
–
–
–
Setembro/2008
hg
hg
hg
hg
hg
hg
hg
hg
hg
hg
hg
hg
add
annotate
commit
copy
diff
help
log
remove
rename
revert
status
update
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
(svn
add)
blame)
commit)
copy)
diff)
help)
log)
delete)
move)
revert)
status)
update)
Juliano F. Ravasi - Sistemas de Controle de Versão
99
O conjunto de comandos do Mercurial é muito
semelhante ao do Subversion. Mesmo comandos
cujo nomes padrões são diferentes possuem
apelidos que os tornam compatíveis entre si (por
exemplo, hg blame e svn annotate, hg delete e svn
remove, hg move e svn rename).
Essa compatibilidade é muito útil e ajuda no
aprendizado paralelo de ambas as ferramentas. Os
comandos variam nas opções que aceitam, mas
sempre há o comando help para guiar durante a
utilização.
Trabalhando com Mercurial
Comandos
●
Acesso a repositórios
–
Local
●
●
–
HTTP, Mercurial
●
●
–
http://hg.example.com/hg/project/
https://hg.example.com/hg/project/
SSH, Mercurial
●
Setembro/2008
/home/user/hg/project/
file:///home/user/hg/project/
ssh://hg.example.com/hg/project/
Juliano F. Ravasi - Sistemas de Controle de Versão
100
Mercurial oferece três formas básicas de se acessar
outros repositórios. Assim como o Subversion,
cada forma de acesso é representada pelo
esquema do endereço passado para os comandos.
Para acesso a um repositório local, hospedado na
mesma máquina, é utilizado o esquema file://, que
pode ser omitido.
Repositórios remotos podem ser acessados via
HTTP ou via SSH se o usuário possuir um login
shell no servidor remoto.
Trabalhando com Mercurial
Criação e clonagem
●
Criação do projeto
–
hg init [diretório]
●
●
Clonagem
–
hg clone origem [diretório]
●
●
●
Setembro/2008
Transforma o diretório atual (ou o diretório
informado) em um repositório Mercurial
Cria uma cópia do repositório de origem
É, implicitamente, uma ramificação
Hg lembra seu repositório de origem
Juliano F. Ravasi - Sistemas de Controle de Versão
101
A cópia de trabalho começa sempre de uma entre
duas formas diferentes: em branco, ou como uma
cópia de outro repositório.
O comando hg init é utilizado para criar um novo
projeto, em branco. O comando transforma o
diretório atual (ou qualquer outro diretório
informado) em uma cópia de trabalho.
O comando hg clone é utilizado para clonar um
repositório já existente, criando uma nova cópia de
trabalho que contém todo o histórico do repositório
original. O comando hg clone é, de certa forma,
análogo ao svn checkout, com a importante
diferença de que todo o histórico do projeto é
copiado.
«Demonstração: inicialização e clonagem»
Trabalhando com Mercurial
Trabalho distribuído
●
Trazer (puxar) submissões
–
hg pull [URL]
●
●
●
–
hg incoming [URL]
●
Setembro/2008
Recupera as diferenças entre o repositório
indicado e o seu, e aplica as alterações.
Se ‘URL’ for omitido, seu repositório de origem
(fornecido ao ‘hg clone’) é considerado.
Atualiza apenas o repositório, use ‘hg update’
para atualizar a cópia de trabalho.
Mostra o que há no repositório indicado que não
há no seu, e pode ser trazido com ‘hg pull’.
Juliano F. Ravasi - Sistemas de Controle de Versão
102
Para trazer submissões de outro repositório, o
comando hg pull é utilizado. Por padrão, o seu
repositório de origem é utilizado (aquele fornecido
ao comando hg clone).
É possível verificar quais submissões serão trazidas,
sem realizar qualquer ação de fato, através do
comando hg incomming.
«Demonstração: puxar submissões»
Trabalhando com Mercurial
Trabalho distribuído
●
Levar (empurrar) submissões
–
hg push [URL]
●
●
●
–
hg outgoing [URL]
●
Setembro/2008
Determina as diferenças entre o seu repositório
e o indicado, e as aplica remotamente.
Se ‘URL’ for omitido, seu repositório de origem
(fornecido ao ‘hg clone’) é considerado.
Não cria ramificações remotas, seu repositório
precisa estar compatível (via ‘hg pull’).
Mostra o que há no seu repositório que não há
no indicado, e pode ser levado com ‘hg push’.
Juliano F. Ravasi - Sistemas de Controle de Versão
103
Para levar submissões para outro repositório, o
comando hg push é utilizado. Por padrão, o seu
repositório de origem é utilizado (aquele fornecido
ao comando hg clone).
É possível verificar quais submissões serão levadas,
sem realizar qualquer ação de fato, através do
comando hg outgoing.
«Demonstração: empurrar submissões»
Trabalhando com Mercurial
Trabalho distribuído
●
Mescla
–
hg heads [rev]
●
–
hg merge [rev]
●
●
Setembro/2008
Mostra as “revisões-cabeça” do grafo de
revisões (todas as ramificações).
Mescla as alterações de uma determinada
cabeça à cópia de trabalho.
Caso ‘rev’ seja omitido, e só houver uma outra
cabeça possível de ser mesclada (não
ambígua), tal cabeça será selecionada.
Juliano F. Ravasi - Sistemas de Controle de Versão
104
Ao puxar submissões de outro repositório, pode ser
necessário mesclar as alterações trazidas ao
repositório local. O comando hg pull informa
quando a mescla é necessária.
O comando hg heads mostra quais são as cabeças
do grafo de revisões, isso é, todas as ramificações
que não possuem descendentes (e são fortes
candidatas a serem mescladas).
O comando hg merge é utilizado para mesclar uma
ramificação à cópia de trabalho, para em seguida
ser submetida como uma revisão que converge as
duas ramificações.
«Demonstração: mescla»
Trabalhando com Mercurial
Consulta de estado
●
Comandos
–
hg status
●
–
hg identify [-i] [-n] [-b] [-t]
●
–
Mostra qual a revisão atual da cópia de trabalho.
hg parents [-r rev] [alvo]
●
Setembro/2008
Mostra arquivos alterados, adicionados, etc.
Mostra as revisões ascendentes da revisão atual
(ou a revisão fornecida).
Juliano F. Ravasi - Sistemas de Controle de Versão
105
O comando hg status funciona como seu equivalente
do Subversion.
O comando hg identify mostra a revisão atual da
cópia de trabalho, fornecendo uma funcionalidade
semelhante ao comando svn info.
O comando hg parents mostra as revisões
ascendentes da revisão atual. Útil ao consultar
revisões de mescla.
Trabalhando com Mercurial
Consulta ao histórico
●
Histórico
–
hg log [-v]
●
●
Visualização
–
hg view
●
●
Setembro/2008
Descrição textual do histórico.
Visualiza o histórico interativamente.
Grafo de revisões.
Juliano F. Ravasi - Sistemas de Controle de Versão
106
O comando hg log, assim como o Subversion, mostra
uma descrição textual das alterações ocorridas ao
longo do histórico do projeto armazenado no
repositório.
O comando hg view permite visualizar o histórico
interativamente, incluindo o grafo de revisões,
permitindo uma clara identificação das
ramificações e mesclas.
«Demonstração: visualização»
Trabalhando com Mercurial
Ramificações
●
Clonagem
–
–
–
●
Locais, anônimas
–
–
●
Criadas implicitamente
Submissão sobre revisão intermediária
Locais, explícitas
–
–
Setembro/2008
Criadas implicitamente
Basta clonar a cópia de trabalho
Eficiente: utiliza hardlinks quando possível
Criadas através de ‘hg branch’
Armazenadas no próprio repositório
Juliano F. Ravasi - Sistemas de Controle de Versão
107
Há várias formas de se utilizar ramificações.
Devido à natureza do controle de versões distribuído,
a simples clonagem do repositório é uma forma
prática de se criar uma nova ramificação. Mercurial
utiliza um armazenamento eficiente que evita a
duplicação do repositório para ramificações locais.
Ramificações locais anônimas são criadas
implicitamente quando submissões são criadas
sobre revisões intermediárias, como já vimos ao
puxar submissões de outros repositórios.
É possível também criar ramificações explicitamente,
com nomes, dentro do próprio repositório através
do comando hg branch.
«Demonstração: ramificações»
Trabalhando com Mercurial
Rótulos
●
●
●
Referenciam determinados changesets
Fazem parte do controle de versões
Comandos
–
hg tag [-l] [-r rev] nome
●
●
–
hg tag [-l] --remove nome
●
Setembro/2008
Cria um novo rótulo ‘nome’ para a revisão ‘rev’.
Parâmetro ‘-l’: rótulo local.
Apaga um rótulo.
Juliano F. Ravasi - Sistemas de Controle de Versão
108
Rótulos são tratados de forma especial. Cada rótulo
faz referência a um determinado changeset, ou
revisão, do repositório.
Rótulos fazem parte do controle de versões. Isso
significa que o Mercurial registra quando um rótulo
é criado ou removido, assim como o faz com
arquivos comuns.
Cada rótulo criado ou removido causa uma nova
submissão ao repositório, que registra a alteração.
«Demonstração: rótulos»
Obrigado!
Juliano F. Ravasi
http://juliano.info/
Esta apresentação:
http://juliano.info/pt/vcs
Setembro/2008
Juliano F. Ravasi - Sistemas de Controle de Versão
109
A versão mais recente desta apresentação pode ser
encontrada em: http://juliano.info/pt/vcs
Copyright © 2008 – Juliano F. Ravasi
Licensed under Creative Commons AttributionNoncommercial-Share Alike 2.5 Brazil License