1. SVN: Controle de revisões com
subversion
Thiago Rafael Becker
thiago.becker@gmail
2. Histórico
● CollabNet, Inc. (http://www.collab.net),
Fev. 2000
– SourceCast (software de colaboração)
● Desenvolvedores: Karl Fogel, Jim Blandy,
Ben Collins-Sussman
● Auxiliaram: Greg Stein, Brian Benlendorf,
Jason Robbins
● “Auto-contido” em Ago. 2001
3. Controle de revisão
● Conceitos
– Repositório (localização central dos dados
versionados)
– Revisão (situação do repositório em um
instante do tempo)
– Histórico (conjunto de versões)
– Módulo (parte de um repositório)
4. Repositório
● Local central aonde são guardados os
arquivos do projeto
● Funciona como um sistema de arquivos
distribuído
● Mantém histórico de alterações, é
possível consultar qualquer momento
deste histórico
● Gravação = commit, leitura = checkout
5. Repositório
● No começo, sistemas de arquivos
– Problema?
6. Repositório
● Problemas?
– Uma vez escrito, não existe maneira de
voltar atrás
– Pode ser feito controle manual da revisão,
mas é trabalhoso
– Pode ser feito um controle do histórico de
cada revisão, mas também é complicado
– Muitas ações antes de gravar um arquivo
desviam a atenção do desenvolvedor
7. Repositório
● Solução: Controle automático de
(versionamento)
– Controle automático da revisão, do histórico,
possibilidade de consultar um projeto em
qualquer momento de seu desenvolvimento
● Solução mais conhecida: CVS
8. CVS
● Concurrent Versions System
● Problemas?
– Impossibilidade de renomear arquivos e
diretórios
● Eles devem ser removidos e depois readicionados
● Perda do histórico com esse método
– Não existe versionamento de diretórios
9. CVS
● Problemas?
– O versionamento de arquivos apresenta
problemas
● Problema da renomeação de arquivos citada
anteriormente
● Dois arquivos com o mesmo nome no mesmo
diretório compartilham o mesmo histórico, mesmo
que ambos não tenham relação
● Versionamento por arquivo
● Ou seja, perde histórico quando não deve, e o
mantém igualemente quando não deve
● Quem poderá nos defender?
10. Subversion!
● Versionamento de arquivos, diretórios, e
metadados do repositório
● Operações de cópia copiam o histórico do
arquivo original para o novo
● Operações de movimentação levam junto
o histórico do arquivo
● Dois arquivos de mesmo nome, no
mesmo diretório, tem históricos
diferentes
● Versionamento por módulo
11. Subversion
● Versionamento por módulo
● Commits atômicos
● Versionamento por módulo, não por
arquivo
● Escolha da camada de transporte
● Diferenciação automática de arquivos
binários e texto
● Branching e tagging eficientes
● Hackability
13. Pradigmas de controle de
revisão
● Lock-modify-unlock
– Problemas administrativos
– Serialização desnecessária
– Falsa sensação de segurança
● Copy-modify-merge
– Cria cópias pessoais do repositório
– Ao executar o commit, deve ser feito uma
mescla das alterações realizadas, e resolver
conflitos com outras alterações
14. Revisões
● São números aplicados a um objeto para
identificar a versão única do objeto
● CVS
– Números de revisão são por arquivo
– Um número de revisão não significa nada
para os demais arquivos
– Um commit atualiza apenas os números de
revisão dos arquivos que foram alterados
15. Revisões
● SVN
– Números de revisão são globais dentro do
repositório
– Identificam o estado do repositório em um dado
instante
– Um commit cria um snapshot do repositório
– Não consome mais espaço, pois é feita uma cópia
simpbólica dos arquivos não alterados
16. Ciclo de Trabalho
● “Checkout” de uma cópia de trabalho
● Atualizar uma cópia de trabalho
● Fazer alterações
● Examinar suas alterações
● Mesclar com as alterações dos demais
● “Commit” das alterações
17. Ciclo da trabalho
● “Checkout” de uma cópia de trabalho
svn checkout file:///home/trbecker/UFRGS
● Atualizar uma cópia de trabalho
svn update [r revisão] [arquivo]
● Saída da atualização
U 'foo' Arquivo foi atualizado
A 'foo' Arquivo foi adicionado ao repositório
D 'foo' Arquivo foi deletado do repositório
R 'foo' Arquivo foi substituído
G 'foo' Arquivo foi mesclado (merged)
C 'foo' Arquivo está em conflito com o existente na cópia
de trabalho
18. Ciclo de trabalho
● Fazer alterações (por conta do desenvolver)
● Examinar suas alterações
svn status
_ L 'foo' Existe um lock do arquivo no diretório .svn
M 'foo' O arquivo tem alterações locais
_M 'foo' Existe uma modificação nos atributos do arquivo
? 'foo' Arquivo não gerenciado
! 'foo' O arquivo era gerenciado, mas foi deletado
A + 'foo' Adicionado com informação de onde veio
M + 'foo' Adicionado com histórioco e possui histórico
local
D 'foo' Agendado para deleção
A 'foo' Agendado para adição
19. Ciclo de trabalho
● Examinar suas alterações
svn diff [r revision:revision] [arquivo]
– Exibe as alterações detalhadas das
mudanças feitas
● Reverte todas as alterações
svn revert
● Grava os dados novos no repositório
svn commit
20. Ciclo de trabalho
● Causadores de conflitos são postos em um
arquivo, como em CVS
● Três arquivos começando com tmp são criados,
um de cada uma das árvores da mesclagem,
tornando possível analisar os arquivos originais,
e usar outras ferramentas de mesclagem
externas
● SVN não permite que sejam cometidos
criadores de conflito, ao contrário do CVS
21. Resolução de conflitos
● Mesclar manualmente os arquivos
(inflizmente nem tudo funciona como
gostariamos :))
● Copiar um dos arquivos tmp por cima de
um do seu arquivo
● Executar svn revert para reverter as
alterações anteriores
● Após resolvidos
– Execute snv resolve
– Delete os arquivos tmp
22. Mensagens de log
● Ao cometer novas revisões ao svn, é
possível adicionar mensagens de log
● Na verdade, é bastante recomendável
● Como fazer
– svn commit m “mensagem de log”
– svn commit F arquivo.log
– svn commit e escrever o arquivo de log no
editor, quando ele aparecer
23. Branching
● Branch: cópia do repositório para edição
paralela
● Tags == branches
● Dois modos de operação
– No servidor
● svn copy url url
– Local
● svn copy trunk branches/trbecker
24. Branching
● Mesclagem
– svn merge – mescla árvores
– Mesmos dois modos de operação: servidor ou
local
Ex: svn merge branches/trbecker trunk
● Resolver conflitos cfme. descrito anteriormente