Escolar Documentos
Profissional Documentos
Cultura Documentos
Controle de Versão
com Bazaar
Marcelo Barros de Almeida
marcelobarrosalmeida@gmail.com
Direitos de cópia
Créditos ShareAlike 2.0
Você é livre para
copiar, distribuir, apresentar e executar trabalhos
fazer trabalhos derivados
fazer uso comercial deste trabalho
Sob as seguintes condições © Copyright 2008
Créditos. Você deve dar crédito ao autor original.
Marcelo Barros
Compartilhe do mesmo modo. Se você alterar, mudar,
ou realizar trabalhos usando este como base,você deve
marcelobarrosalmeida@gmail.com
redistribuir o trabalhos resultante sob uma licença Correções, sugestões e
idêntica a esta. traduções são bem vindas!
Para qualquer reuso ou distribuição você deve deixar claro
os termos de licença deste trabalho.
Qualquer uma destas condições podem ser abandonadas
se você obtiver uma permissão do detentor dos direitos
autorais.
Faça uso justo e o direitos dos outros não serão afetados de
forma alguma pelas restrições acima.
Texto da licença:
http://creativecommons.org/licenses/bysa/2.0/legalcode
2
Marcelo Barros ?
● Formação:
● Engenheiro eletrônico (EFEI, 1996)
● Mestre (UFMG, 1998)
● Doutor (UFMG, 2002)
● Atualmente:
● Engenheiro (Smar Equip. Industriais LTDA)
smar
● Professor do Barão de Mauá
● Detalhes:
http://linuxabordo.com.br/wiki/index.php?title=Marcelo_Barros
http://jedizone.wordpress.com
3
Roteiro
Conceitos de gerência de configuração e controle de
versão
Ferramentas para controle de versão disponíveis
Controle de versão centralizado x distribuído
Utilizando o Bazaar para controle de versão
Criando repositórios
Adicioando/removendo arquivos e diretórios
Gerenciando TAGs e exportando versões
Diferenças entre arquivos e desfazendo mudanças
Ramos e merges
Usando o Bazaar como servidor 4
Gerência de Configuração
Definição:
”Conjunto de atividades projetadas para controlar as mudanças
pela identificação dos produtos do trabalho que serão alterados,
estabelecendo um relacionamento entre eles, definindo o
mecanismo para o gerenciamento de diferentes versões destes
produtos, controlando as mudanças impostas, e auditando e
relatando as mudanças realizadas”
Roger Pressman, ”Software Engineering: A Practitioner's Approach”
É uma etapa essencial no processo de desenvolvimento
de software
5
Enquete:
Como você controle o software que produz ?
Controlar o quê ?
Precisa controlar ?
Não controlo
Vou renomeando os arquivos
Vou copiando em diretórios
Vou criando arquivos zips
Controle de versão descentralizado
Controle de versão centralizado
6
Vantagens de se controlar versão
Cria um histórico do projeto, com todas as mudanças
realizadas
Permite um trabalho em equipe
Permite paralelizar o desenvolvimento através do conceito
de ramos
Permite recuperar pontos específicos durante o processo
de desenvolvimento do software
Permite correções especificas para determinados clientes
Se associado a um ”bug tracker”, passa a amarrar as
mudanças com os motivos da mudança (Mantis, Trac, etc)
7
Como funciona ?
Versão inicial
Funcionamento básico:
Um repositório para o código é criado
A versão inicial do código é adicionada Repositório
(local ou
ao repositório remoto)
O usuário cria uma cópia de trabalho Revisão n
Esta cópia sofre alterações
Revisão n+1
As alterações são consolidadas no
repositório, devidamente comentadas
No repositório é mantido o código e o Usuário
rastreio de todas as mudaças
Modificações
8
Como funciona ?
Funcionamento avançado:
Versão original
Trabalho coletivo, com múltiplas
cópias de trabalho e vários Revisão 1
Branch
usuários
Ramo a
Vários ramos de
desenvolvimento Revisão 2
Branch
Revisão a1
Operações de ”merge” para
unificar trabalhos em ramos Merge
Revisão a2 Ramo b
diferentes
Geração de TAGs Revisão 3 Revisão b1
Operações de ”updates”, para
atualizar cópias de trabalho
9
Algumas ferramentas para controle de versão
Código aberto/gratuitas: Código fechado/comerciais:
CVS (Concurrent Version Clearcase
System) Sourcesafe
Subversion AccuRev
Bazaar Perforce
Git Plastic SCM
Mercurial BitKeeper
GNU arch Synergy
Monotone
Darcs
Fonte: http://en.wikipedia.org/wiki/Comparison_of_revision_control_software 10
Centralizado x distribuído
(ou talvez cliente/servidor x peer to peer)
Centralizado:
Repositório é mantido num servidor onde o controle
de acesso e controle geral do projeto é feito
Desenvolvedores fazem cópias de trabalhos que se
referenciam ao repositório sempre que alterações
precisarem ser submetidas
Distribuído:
Cada cópia de trabalho é também um repositório
completo, com direitos locais (não é necessário pedir
permissão para alterar o repositório local)
O repositório original não sabe o que é feito em cada
cópia de trabalho até que ela seja enviada de volta
pelo desenvolvedor
Qual o melhor ? Não existe. É uma decisão
casoacaso Imagens:
http://kids.nationalgeographic.com/Stories/AnimalsNature/Catversusdogroundone
11
http://kids.nationalgeographic.com/Stories/AnimalsNature/Playingfavoritescatordog
Ferramentas gratuitas e de fonte aberta
Distribuído: Centralizado:
Bazaar CVS (Concurrent Version
Git System)
Mercurial
Subversion
GNU arch
Monotone
Darcs
12
Por que usar Bazaar ?
Fácil de usar e personalizar, além de bastante flexível
É escrito em Python (multiplataforma, extensível, ciclos
rápidos de desenvolvimento)
Comunidade grande e ativa (Canonical/Ubuntu)
Gratuito e de fonte aberta
Repositório eficiente (compacto)
http://bazaarvcs.org/
Desvantagem:
Um pouco lento para projetos grandes
13
Sistemas estilo cliente/servidor
Jargão da área (sistemas centralizados):
Checkout: ação para criar uma cópia de trabalho
Commit: ação de enviar modificações feitas na
cópia de trabalho para o respositório
Update: significa trazer modificações do
repositório para a cópia de trabalho
Branch: ramificação do código fonte em algum
momento da sua história
Merge: significa mesclar modificações da cópia de
trabalho com as de outro branch/versão
14
Jargão do Bazaar
Qualquer ramo é um repositório, logo não faz
sentido em falar de cópia de trabalho.
Commit: ação para enviar as modificações para o
repositório
Branch: ramificação do código fonte em algum
momento da sua história
Merge: significa mesclar modificações da cópia de
trabalho com as de outro branch/versão qualquer
Push: enviar modificações do ramo para um outro
ramo, espelho deste
Pull: trazer modificações de um outro ramo para o
atual, espelho do anterior
15
Bazaar: primeiros passos
Interface de linha de comando*
bzr <comando> <opções>
Exemplos:
bzr help commands
bzr help init
bzr add arquivo.c
bzr commit m ”versao inicial”
bzr tag ”V1.0.0”
bzr branch meuprojet meuprojetov2
O controle do repositório fica na raiz do projeto, em um
diretório chamado .bzr
(*) Existem algumas interfaces gráficas mas o uso pela linha de comando é muito simples 16
Bazaar: criando o repositório
No ponto onde deseja criar o projeto,
use o comando init:
cd /home/trabalhos
bzr init redes
Isto gerará um diretório redes e,
dentro dele, o repositório,
chamado .bzr
O repositório está pronto para ser
usado agora
17
Bazaar: adicionando arquivos e diretórios
Crie/copie os arquivos e diretórios necessários para o projeto
Veja o status dos arquivos como ”desconhecido” com:
bzr status
Adicione tudo ao repositório com o command add:
bzr add
Por curiosidade, veja agora o status de ”adicionado”:
bzr status
Faça o comissionamento das mudanças:
bzr commit
Pronto ! O histórico pode ser visto com:
bzr log
18
Bazaar: adicionando arquivos e diretórios
$ cd /home/marcelo/projetos/redes/ $ bzr status
$ mkdir source added:
$ mkdir include Makefile
$ touch Makefile include/
$ touch source/luke.c include/yoda.h
$ touch include/yoda.h source/
$ tree source/luke.c
.
|-- Makefile $ bzr commit -m "Versao inicial"
|-- include Committing to:
| `-- yoda.h /home/marcelo/trabalhos/redes/
`-- source added Makefile
`-- luke.c added include
added source
$ bzr status added include/yoda.h
unknown: added source/luke.c
Makefile Committed revision 1.
include/
source/ $ bzr log
-----------------------------------------
$ bzr add revno: 1
added Makefile committer: Marcelo Barros de Almeida
added include <marcelo@dexter>
added source branch nick: redes
added include/yoda.h timestamp: Thu 2008-05-01 15:42:11 -0300
added source/luke.c message:
Versao inicial
19
Bazaar: comentários sobre adição de
arquivos e diretórios
O command add é recursivo, mas pode ser usado com um diretório
ou arquivo como argumento, para uma ação específica
bzr add Makefile
O mesmo é válido para o comando status
O comentário do comissionamento é obrigatório. Tente sempre
colocar algo bem conciso e que reflita realmente a mudança
Durante a vida do projeto, qualquer novo arquivo/diretório deve
passar pelo comando de adição e comissionamento
A exclusão é feita através do comando remove, seguido também do
comissionamento
Caso o arquivo seja removido diretamente pelo usuário, o Bazaar irá
também removêlo na fase de comissionamento
20
Bazaar: adicionando/removendo arquivos e
diretórios
$ mkdir doc $ bzr commit -m "trocando luke por vader,
$ touch doc/readme.txt adic. doc"
$ touch source/vader.c Committing to:
$ bzr status /home/marcelo/trabalhos/redes/
unknown: added doc
doc/ added doc/readme.txt
source/vader.c added source/vader.c
deleted source/luke.c
$ bzr remove source/luke.c Committed revision 2.
deleted source/luke.c
$ bzr log
$ bzr add ------------------------------------------
added doc revno: 2
added doc/readme.txt committer: Marcelo Barros de Almeida
added source/vader.c <marcelo@dexter>
branch nick: redes
$ bzr status timestamp: Thu 2008-05-01 16:06:03 -0300
removed: message:
source/luke.c trocando luke por vader, adic. doc
added: -------------------------------------------
doc/ revno: 1
doc/readme.txt committer: Marcelo Barros de Almeida
<marcelo@dexter>
branch nick: redes
timestamp: Thu 2008-05-01 15:42:11 -0300
message:
Versao inicial
21
Bazaar: criando o repositório à partir de um
projeto existente
Se o seu código já reside em <dir>/projeto e precisa ser
controlado, faça o seguinte:
cd <dir>/projeto
bzr init
bzr add
bzr commit
22
Prática 1: criando repositórios
Crie um repositório com a seguinte estrutura de arquivos e
diretórios:
|-- Makefile
|-- doc
| `-- install
|-- inc
| |-- java.h
| `-- perl.h
`-- src
`-- main.c
Altere os arquivos/diretórios do projeto, comissionando
depois com mensagens pertinentes
Adicione e apague arquivos do seu repositório
Use os comandos status e log quando for conveniente
23
Bazaar: criando rótulos (TAGs) para o seu
código
É comum fazer referências simbólicas ao código, como
V1.0.1, V5.0.0RC2, beta10, entre outras
Este processo, chamado rotulação (tagging), permite
amarrar um nome simbólico (rótulo) a uma revisão
específica do código, no decorrer do desenvolvimento
Isto facilita a referência à versões importantes ou
entregues para cliente
24
Bazaar: criando rótulos (TAGs) para o seu
código
É comum se usar um esquema 0.9
1.0
de 3 dígitos para nomear uma 0.9.1
1.1
versão. 1.0.1
2.0
0.9.2
Versões oficiais levam apenas 2 1.1.1
1.0.2
dígitos 0.9.3 2.0.1
1.1.2
Versões intermediárias levam 3 1.0.3
2.0.2
dígitos 1.1.3
[ major.minor.build ] 2.0.3
Primeiro dígito: mudanças profundas, alteração de interfaces
externas
Segundo dígito: mudanças menores, melhorias, interfaces externas
mantidas e interfaces internas alteradas, correções graves
Terceiro dígito: pequenas correções de erros, pequenas mudanças 25
Bazaar: criando rótulos (TAGs) para o seu
código
No Bazaar, é implementado através do comando tag:
bzr tag <nome_da_versão>
A revisão corrente será rotulada com nome_da_versão
Dica: faça o comissionamento antes para assegurar que está
rotulando a versão correta
É possível rotular uma revisão existente qualquer:
bzr tag <nome_da_versão> r <revisão>
Também é permitido apagar um determinado rótulo:
bzr tag <nome_da_versão> delete
Para listas todas as tags existentes, use:
bzr tags
26
Prática 2: criando rótulos (TAGs)
Modifique o código do seu repositório e adicione tags a
versões que julgar importante
Rotule versões antigas através da opção ”r”
Experimente apagar TAGs com ”delete”
Use o comando ”tags” e ”log” para listar as tags
disponíveis e a que revisões elas estão associadas
27
Bazaar: exportando o código
Permite gerar uma cópia limpa do
código, isto é, sem o repositório
Ideal para enviar por email ou para
backup
Suporta vários formatos, como zip,
tar, tgz,bz2, de forma automática.
Basta colocar a extensão desejada
Podem ser usados tanto números de
revisões como tags
28
Bazaar: exportando o código
No Bazaar, é implementado através do comando export:
bzr export r <revisão> <nome_do_arquivo.extensão>
bzr export r tag:<rótulo> <nome_do_arquivo.extensão>
A revisão especificada será exportada segundo o formato da
extensão
Exemplos:
bzr export r 2 ../versao2.zip
bzr export r 3 ../versao2.bz2
bzr export r tag:V1.0 ../Versao_1.0.zip
29
Prática 3: exportando versões
Exporte versões do seu repositório, usando tanto revisões
quanto tags como argumento
Use também formatos diferentes de arquivos
Verifique o conteúdo do arquivo exportado. Perceba que
somente o código fonte puro é exportado
Use o comando ”tags” e ”log” para listar as tags
disponíveis e a que revisões elas estão associadas
30
Bazaar: arrependendimento é possível com
diff e revert
diff: lista as diferenças entre duas revisões:
bzr diff r <revisão> [arquivo/diretório]
Exemplos:
bzr diff r tag:V1.2 (diferenças entre a revisão atual e a V1.2)
bzr diff r2..3 (diferenças entre as revisões 2 e 3)
bzr diff r 3 src/main.c (diferenças entre a revisão atual do
arquivo main.c e a sua revisão 3)
=== modified file 'src/main.c' A versão atual do arquivo main.c
--- src/main.c 2008-05-06 01:25:08 +0000 (verde) removeu as linhas de 1 a
+++ src/main.c 2008-05-06 01:33:39 +0000 3 (1,3) do arquivo original
@@ -1,3 +1,5 @@ (vermelho), substituindoas pelas
+#include <stdio.h> linhas de 1 a 5 (+1,5), a seguir.
+ As parte alteradas tem um + na
int main(int){ frente e as partes mantidas ficam
return 0; inalteradas.
}
31
Bazaar: arrependendimento é possível com
diff e revert
revert: reverte o arquivo para a revisão especificada
bzr revert r <revisao> [arquivo/diretório]
Exemplos:
bzr revert r tag:V1.2 (reverte a revisão atual para a V1.2)
bzr revert r 3 src/main.c (reverte a revisão atual do arquivo
main.c para a sua revisão 3 correspondente)
Você pode ir e voltar nas revisões ! Tudo é refeito
(diretórios/arquivos criados ou apagados). Só não
esqueça de ter tudo comissionado antes de começar.
32
Prática 4: diff e revert
Provoque algumas mudanças, fazendo comissionamento
entre elas. Depois procure entender a saída do comando
diff entre a revisão corrente e revisões anteriores.
Use o comando revert para reverter a revisão atual para
uma outra revisão qualquer. Fique atento e perceba o que
foi alterado.
33
Bazaar: trabalhando com ramos (branches)
Derivações do projeto principal
acontecem por vários motivos:
Implementações de novas características
de forma controlada
Divisão do trabalho entre grupo de
desenvolvedores
Suporte a versões específicas, com
correções localizadas
Ramificações fazem parte da vida de
um projeto, assim como merges e
updates
Imagem: Almond Branches in Bloom de Vincent van Gogh
34
Bazaar: trabalhando com ramos (branches)
Em sistemas de controle de versão distribuídos, cada
branch leva consigo toda a informação do repositório.
Exceções existem, como o ”git”.
Cada ramo passa a ter vida própria (tem o seu próprio
repositório .bzr)
Posteriormente, merges podem ser feitos para que os
ramos sejam atualizados
Os ramos carregam informações sobre sua origem para
facilitar merges futuros
35
Bazaar: trabalhando com ramos (branches)
No Bazaar, cada novo ramo é criado com o comando
branch, da seguinte forma:
bzr branch <repositório_original> <novo_ramo>
Um diretório novo_ramo será criado, como um espelho do que
existia em repositório_original
Dicas: é mais fácil estar num nível externo ao repositório
Também é possível usar uma revisão ou TAG como
referência para a criação de um ramo:
bzr branch r <revisão> <repositório_original> <novo_ramo>
bzr branch r tag:<rótulo> <repositório_original> <novo_ramo>
36
Prática 5: branches
Crie ramos do seu repositório
Faça modificações em cada um deles
Comissione, gerando revisões localizadas em cada ramo
Use o comando ”tags” e ”log” para listar as tags
disponíveis e a que revisões elas estão associadas
37
Bazaar: atualizando ramos (merge)
Através do comando merge é possível trazer modificações
de um ramo qualquer para o ramo atual
O bazaar tenta unificar as alterações dos dois ramos, de
forma automática
Em caso de conflito (alterações na mesma região do
código em ramos diferentes), será necessário que o
usuário a resolva manualmente
É possível ver diferenças entre ramos também. Supondo
que se está no diretório do repositório, faça:
bzr diff r branch:../<ramo_original>
38
Bazaar: resolvendo conflitos
Para cada arquivo em conflito, são criados 3 arquivos, com extensões
BASE, OTHER e THIS. Um conflito em main.c irá gerar:
main.THIS: a revisão local do ramo
main.OTHER: a revisão que veio do outro ramo
main.BASE: o ancestral comum entre eles
Além disso, o arquivo main.c terá marcas dentro dele, indicando a área
de conflito. Resolva o conflito manualmente e faça:
bzr resolved main.c
Use uma ferramenta para comparação de fontes, caso tenha dúvida:
Winmerge, Araxis <<<<<<< TREE
Kdiff3, meld trecho de código do ramo corrente
=======
Finalmente, comissione trecho de código do ramo de onde se deseja
obter o merge
>>>>>>> MERGE-SOURCE
39
Prática 6: merges
Exercite a função ”merge” entre os seus repositórios
criados na prática anterior
Force uma situação onde será necessário resolver um
conflito de forma manual. Para isto, gere modificações nas
mesmas linhas de um arquivo, em ramos diferentes.
Comissione as modificações e tente fazer o merge
Inspecione os arquivos com extensão THIS, OTHER e
BASE. Use o comando ”resolved” após resolver o conflito
Comissione o resultado do merge
40
Bônus track do Bazaar: acesso remoto
Para permitir o acesso remoto ao seu repositório, use o
comando ”server”. Todos os repositórios abaixo do local
onde o Bazaar for rodado estarão disponíveis via porta
4155:
$cd /home/marcelo/trabalhos
$ bzr init tcc
$ bzr init redes
$ bzr server
listening on port: 4155
Use a opção –allowwrites para permitir escritas
$cd /home/marcelo/trabalhos
$ bzr init tcc
$ bzr init redes
$ bzr server --allow-writes
listening on port: 4155
41
Bônus track do Bazaar: acesso remoto
Faça um checkout especificando o repositório remoto e
passe a trabalhar no modelo centralizado:
bzr checkout bzr://127.0.0.1/tcc
Ou faça um branch e passe a trabalhar no modelo
descentralizado:
bzr branch bzr://127.0.0.1/redes
No primeiro caso, cada comissionamento irá ser enviado
ao servidor, já no segundo não. Nesta situação, para
enviar as mudanças, use o comando push:
bzr push bzr://127.0.0.1/redes
42
Referências
Controle de versão com Bazaar
http://www.linuxabordo.com.br/wiki/index.php?title=Bazaar
Comparação entre Ferramentas de Controle de Mudança
http://www.pronus.eng.br/artigos_tutoriais/analises/ferramentasCon
Comparison of revision control software
http://en.wikipedia.org/wiki/Comparison_of_revision_control_soft
ware
43
Dúvidas, comentários, sugestões ?
44
Imagem: cena do filme Madagascar, da DreamWorks