Índice: Subversion (Controle de Versões)
- 1. O quê é subversion?
- 2. Como o subversion resolve esse problema?
- 3. Espere aí... isso não é CVS?
- 4. Compartilhamento controlado é a única vantagem do subversion?
- 5. Edição simultânea
- 6. Como aprendo mais sobre o subversion?
- 7. O que é um repositório?
- 8. O subversion é só para trabalhos em grupo então?
- 9. Como crio um repositório?
- 10. Quantas contas existem então?
- 11. Quanto espaço meus repositórios podem ocupar?
- 12. O qué é uma URL do subversion? Qual é a URL do meu repositório?
- 13. Posso acessar meu repositório de fora da Rede?
- 14. Exemplo básico
- 15. Como migrar sua working copy para referenciar o novo servidor
- 16. Meu arquivo está em 'conflict', mas juro que já resolvi!
1. O quê é subversion?
O subversion é um novo serviço da Rede Linux. Consiste num sistema de armazenamento incremental para projetos acadêmicos. Por exemplo, suponha que você está fazendo um trabalho em grupo, e você quer que todas as pessoas do grupo possam mexer nos arquivos do projeto. Uma maneira muito utilizada para fazer isso é ajustar as permissões de forma que todos possam mexer nos arquivos, pois não é possível, através do sistema de arquivos, permitir acesso somente a alguns usuários seletos: ou você deixa aberto só para você, ou para todo mundo (ou todo o grupo, que não é muito melhor). Isso deixa os arquivos do seu projeto vulneráveis de duas maneiras: outros alunos podem copiar o seu projeto sem autorização e também (muito pior) podem sabotar o seu projeto (e, claro, você só vai perceber isso na véspera da entrega e não terá backups. Se você tiver backups, eles já vão ser da versão sabotada. Básico). O servidor de subversion foi instalado para resolver esse tipo de problema. Continue lendo...
2. Como o subversion resolve esse problema?
O subversion permite que você crie áreas de armazenamento num servidor e crie contas de acesso para que os membros do projeto possam acessar a área. Desta forma, somente as pessoas para quem você abriu contas poderão mexer nos arquivos. Se você já ouviu falar do SourceForge, o conceito é parecido.
3. Espere aí... isso não é CVS?
O CVS funciona de maneira muito parecida. Na verdade, o subversion (veja http://subversion.tigris.org) é um novo programa de controle de versões que visa ser um substituto melhorado para o CVS. Ele mantém todas as vantagens do CVS, e procura remediar os seus problemas mais conspícuos.
4. Compartilhamento controlado é a única vantagem do subversion?
Não. Uma outra característica do subversion (e de todos os sistemas de controle de versão em geral) é que ele armazena não somente os arquivos do seu projeto, mas toda a história de criação, deleção e alteração desses arquivos. Então, por exemplo, se você um dia introduzir acidentalmente um bug no seu programa e não conseguir mais tirar de jeito nenhum, ou se você complicou tanto uma função que ninguém (nem mesmo você) consegue mais consertá-la, você pode recorrer ao subversion: você pode dar um comando do tipo "restaure o arquivo coisa.c do jeito que ele estava no dia 20 de março de 2004, às 15:34."
Você pode ainda visualizar informações úteis como por exemplo:
- O quê foi mudado no coisa.c de ontem para hoje? Quem foi o responsável (para culpá-lo ou elogiá-lo. Provavelmente culpá-lo)?
- Quando a alteração X foi feita, qual foi a mensagem explicativa que o autor da modificação deixou?
- Como estava exatamente cada arquivo do projeto quando soltamos a versão 0.5-beta na semana passada?
- Etc, etc, etc...
5. Edição simultânea
Além de todas essas vantagens, o subversion permite edição simultânea dos arquivos por dois ou mais usuários, inclusive edição do mesmo arquivo. Por exemplo, se você está editando coisa.c e adiciona uma função imprimeCoisa(), e, ao mesmo tempo, um de seus colegas está editando o coisa.c e adiciona uma função imprimeOutraCoisa(), o subversion mescla os arquivos automaticamente, incorporando ambas as mudanças.
Claro que o subversion não é mágico, então se duas ou mais pessoas fizerem modificações conflitantes num mesmo arquivo, ele reclamará, mas lhe informará quais partes do arquivo estão em conflito e quais as versões possíveis. Desta forma, basta você editar o arquivo para solucionar os conflitos.
6. Como aprendo mais sobre o subversion?
Um documento bastante completo sobre o subversion é o Subversion Book, que pode ser lido no site oficial do subversion: http://subversion.tigris.org
Para usar o subversion da Rede, você só precisa entender a parte sobre a utilização do cliente subversion, pois a administração do servidor subversion é feita por nós. A seção sobre "Branching and Merging" é meio complicada e não é essencial para a maioria dos projetos que você vai precisar fazer aqui no IME.
7. O que é um repositório?
Um repositório é uma área de armazenamento no servidor que é destinada a um projeto específico. Você como usuário da Rede pode criar, deletar e administrar os seus próprios repositórios. Então, quando você, fulano e cicrano forem começar um projeto em grupo, um de vocês irá criar o repositório e criar as contas para cada um de vocês acessá-lo.
8. O subversion é só para trabalhos em grupo então?
Não, você também pode utilizá-lo para seus trabalhos individuais. Naturalmente, você não utilizará o recurso de edição simultânea, mas ainda assim a função de armazenamento de história pode vir a ser útil.
9. Como crio um repositório?
Em primeiro lugar, para poder criar e administrar repositórios, você deve comparecer (fisicamente) à Administração da Rede (sala 125 do bloco A) para pedir a criação de uma conta subversion. O login dessa conta será o mesmo login da Rede Linux, mas a senha é independente. Isto é, mudar a senha da sua conta subversion não alterará a sua senha da Rede Linux e vice-versa.
Depois de ter a sua conta subversion, tudo que você precisa fazer é ligar-se na Rede e correr o seguinte programa:
rlsvnadmin
Estamos actualmente trabalhando numa interface gráfica em GTK para a mesma funcionalidade. Na época em que esse item do FAQ foi escrito, essa versão ainda estava em testes, mas logo estará terminada. O comando para utilizá-la é:
rlsvngui
A interface é relativamente auto-explicativa. Ou pelo menos nós achamos que é. Se você discorda, mande um e-mail para a administração para que possamos corrigir o programa de forma a torná-lo mais fácil de usar.
Atenção: Lembre-se de criar contas nos novos repositórios que você criar! Se você não criar nenhuma conta, ninguém conseguirá acessar o repositório, nem mesmo você.
10. Quantas contas existem então?
Há três contas diferentes: a conta da Rede Linux é uma coisa; a conta subversion é outra. E há ainda as contas que você pode criar para acesso aos seus repositórios. É um pouco confuso, mas você se acostuma.
11. Quanto espaço meus repositórios podem ocupar?
Cada usuário pode ter, no máximo, até 12 MB (doze megabytes) no total, isto é, a soma do tamanho de todos os repositórios de um determinado usuário tem que ser não superior a 12 MB. Se você ultrapassar o limite, entraremos em contato e pediremos para você deletar repositórios que você não usa mais, etc. Nós nos reservamos o direito de deletar repositórios de usuários que permaneçam em violação do limite após serem avisados. Também nos reservamos o direito de apagar repositórios se o tamanho total dos seus repositórios estiver estupidamente acima de 12 MB e estiver prejudicando os outros usuários. Contamos com a sua cooperação para não precisarmos impor um limite mais rigidamente controlado.
12. O qué é uma URL do subversion? Qual é a URL do meu repositório?
O subversion utiliza URLs para identificar repositórios. Se o seu login é fulano e o nome do repositório é meurepos, a URL é:
svn://coruscant/fulano/meurepos
Veja na seção "exemplo básico" abaixo para uma idéia de como URLs do subversion são utilizadas. Essa URL é para uso interno na Rede somente, isto é, só funcionará se você estiver logado na Rede Linux. Se quiser acessar o seu repositório do mundo exterior, veja o item seguinte.
13. Posso acessar meu repositório de fora da Rede?
Sim, basta utilizar shell.linux.ime.usp.br ao invés de coruscant na URL. Então, usando o mesmo exemplo do item anterior, a URL seria:
svn://shell.linux.ime.usp.br/fulano/meurepos
14. Exemplo básico
Vamos a um exemplo. Suponha que você, Foolan Smith (login foolan), e seu amigo Belltran Burns (login belltran) decidem embarcar num longo e complicado projeto de computação paralela para compilações de sistemas de programação não linear otimizados auto-replicantes, auto-documentantes e que ainda por cima produz pipoca a partir de parafusos. O projeto chama foo.
Então, em primeiro lugar, você, Mr. Smith, cria o repositório (tendo antes vindo à administração para obter uma conta subversion, naturalmente). Você loga num terminal da Rede Linux, usando sua senha da Rede Linux e roda o programa rlsvnadmin. Quando ele perguntar o login e a senha, o login será foolan e a senha será a senha da conta subversion, não da Rede Linux. Na interface, você escolherá "Criar novo repositório" e especificará o nome foo. Então você estará de volta ao menu principal. Agora escolha o repositório foo e tecle ENTER. Você será levado a uma tela de configuração do repositório. Selecione "Adicionar/alterar usuário" para criar os usuários foolan e belltran, fornecendo as senhas que cada um utilizará. Note que essas contas que você cria podem ter qualquer nome, pois são independentes da Rede: são contas para o seu repositório. No seu repositório você é o rei.
Ok, agora você liga para seu colega, cujo nome é Burns. Belltran Burns. Você lhe diz que o repositório está pronto e que sua senha é montgomery.
Para trabalhar no repositório, você dá checkout, faz suas modificações e depois dá commit. Por exemplo, você vai começar o projeto escrevendo um arquivo chamado main.c. Então você faria:
$ svn co svn://coruscant/foolan/foo(digite sua senha para a conta do seu repositório)
$ cd foo
$ emacs main.c
(agora você escreve o main.c, salva e sai)
$ svn add main.c
$ svn commit -m "Adicionei o arquivo principal."
Note que o repositório é identificado pela URL svn://coruscant/foolan/foo. Essa URL é específica do subversion, i.e. não adianta colocá-lo no Netscape ou Mozilla e esperar que aconteça alguma coisa que não seja uma mensagem de erro. Naturalmente, a regra geral para a URL de um repositório é:
svn://coruscant/nome_do_criador/nome_do_repositório
Agora o Mr. Burns vai querer ver o quê você fez. Aí ele loga na Rede Linux e faz o seguinte:
$ cd ~
$ svn co svn://coruscant/foolan/foo
(Mr. Burns digita a senha 'montgomery')
$ cd foo
$ ls
main.c
$ emacs main.c
(Mr. Burns corrige 3 bugs estúpidos que você escreveu,
e introduz mais 41 outros)
$ svn commit -m "Todos os bugs corrigidos! Eu sou O cara!"
Agora Mr. Burns te liga e diz "Eu corrigi todos os seus bugs! Veja só que maravilha está agora!". Aí você, para ver as modificações, faz o seguinte:
$ cd ~/foo $ svn update
Note que você não precisa dar checkout de novo, pois você já tem uma "working copy". O comando svn update incorpora, na sua cópia, as modificações que ocorreram no repositório.
Aí você abre o main.c e fica horrorizado. O Mr. Burns, além de não ter corrigido os 3 bugs, introduziu nada menos que 41 outros. Na verdade mais, mas você perdeu a conta. Você tenta corrigir, mas o programa se recusa a funcionar de novo porque o Mr. Burns justamente deletou as poucas linhas certas de código que o projeto tinha. E agora? Então você decide restaurar a primeira versão que você tinha escrito. Para isso, você dá os comandos:
$ cd ~/foo
$ svn log
------------------------------------------------------------------------
r1 | foolan | 2004-03-17 14:47:08 -0300 (Wed, 17 Mar 2004) | 1 line
Adicionei o arquivo principal.
------------------------------------------------------------------------
r2 | belltran | 2004-03-17 18:12:13 -0300 (Wed, 17 Mar 2004) | 1 line
Todos os bugs corrigidos! Eu sou O cara!
------------------------------------------------------------------------
A partir dessa saída, você percebe que o quê você quer fazer é "desfazer a revisão 2", isto é, "ir da revisão 2 para a 1". Então você faz o seguinte:
$ svn merge -r2:1 main.c $ svn commit -m "main.c restaurado para desfazer o estrago do Mr. Burns"
Agora, se você está realmente irritado com o Mr. Burns, você pode entrar no rlsvnadmin para deletar o usuário belltran do repositório foo :-)
Fim do exemplo. Naturalmente isso foi só uma idéia de como o subversion funciona, mas recomendamos fortemente ler o Subversion Book disponível no site oficial http://subversion.tigris.org antes de usar esse serviço.
Aviso de isenção de responsabilidade. Todas as marcas registradas mencionandas nesse exemplo são de propriedade dos seus respectivos proprietários (ó, que fascinante), e toda e qualquer semelhança com nomes de personagens amarelos de desenhos animados, ou de personagens de óculos escuros de filmes de ficção científica, é meramente coincidência e não foi de nenhuma forma premeditada pelos criadores do supracitado exemplo. "montgomery" foi uma senha gerada aleatoriamente e não tem relação alguma com o primeiro nome do personagem amarelo no qual nós não nos baseamos para a criação do personagem Belltran Burns. Os criadores desse exemplo não serão responsáveis por quaisquer danos incidentais, consequentes ou indiretos advindos da compreensão, ou impossibilidade da compreensão, desse exemplo; em especial, não seremos responsáveis se seu repositório for sabotado porque você utilizou a senha "montgomery".
15. Como migrar sua working copy para referenciar o novo servidor
Em 2004-05-16, o servidor subversion da Rede deixou de ser o coliseu e passou a ser o coruscant. As working copies (cópias locais de repositório que você obteve através de svn checkout) precisam ser atualizadas para que passem a procurar o coruscant ao invés do coliseu. Para isso, utilize o comando seguinte:
svnmigra meudiretorio
Onde, naturalmente, meudiretorio é a working copy que você quer migrar.
Nota: as working copies que você obteve de fora da rede via svn checkout svn://shell.linux.ime.usp.br/... não precisam ser migradas, já que o endereço virtual shell.linux.ime.usp.br foi atualizado para apontar para o coruscant.
16. Meu arquivo está em 'conflict', mas juro que já resolvi!
Depois que você resolve um conflito num arquivo, (não esqueça de remover os marcadores que o svn colocou no arquivo), você precisa informar ao svn que você resolveu o conflito. O comando é svn resolved. Por exemplo, se o arquivo se chama pizza.txt, o comando seria:
svn resolved pizza.txt
Só depois de resolver todos os conflitos é que você poderá dar um commit no repositório. Atenção: NUNCA dê svn resolved num arquivo cujo conflito você não resolveu. Mentir para o svn nesse sentido pode causar problemas graves, pois ele vai entender que as marcas de conflito do arquivo são realmente parte do arquivo. Em outras palavras, nunca tente resolver um conflito "na marra", pois você terá muito mais trabalho depois. Revise cuidadosamente cada arquivo que está em conflito e remova as marcas