Pergunta

Eu tenho visto essas palavras muito em discussões sobre Subversion (e acho que em repositórios gerais).Tenho usado SVN em meus projetos nos últimos anos, mas nunca entendi o conceito completo desses diretórios.

O que eles querem dizer?

Foi útil?

Solução

Hmm, não tenho certeza se concordo com o fato de Nick re tag ser semelhante a um galho.Uma tag é apenas um marcador

  • Porta-malas seria o principal órgão de desenvolvimento, originado desde o início do projeto até o presente.

  • Filial será uma cópia do código derivada de um determinado ponto do tronco que é usada para aplicar grandes alterações ao código, preservando a integridade do código no tronco.Se as principais mudanças funcionarem conforme o planejado, elas geralmente serão incorporadas de volta ao tronco.

  • Marcação será um ponto no tempo no tronco ou galho que você deseja preservar.As duas principais razões para a preservação seriam que ou esta é uma versão principal do software, seja alfa, beta, RC ou RTM, ou este é o ponto mais estável do software antes da aplicação de grandes revisões no tronco.

Em projetos de código aberto, as principais ramificações que não são aceitas no tronco pelas partes interessadas do projeto podem se tornar a base para garfos -- por exemplo, projetos totalmente separados que compartilham uma origem comum com outro código-fonte.

As subárvores branch e tag são diferenciadas do tronco das seguintes maneiras:

O Subversion permite que administradores de sistemas criem scripts de gancho que são acionados para execução quando ocorrem determinados eventos;por exemplo, submeter uma alteração ao repositório.É muito comum que uma implementação típica de repositório Subversion trate qualquer caminho contendo "/tag/" como protegido contra gravação após a criação;o resultado líquido é que as tags, uma vez criadas, são imutáveis ​​(pelo menos para usuários "comuns").Isso é feito através dos scripts de gancho, que reforçam a imutabilidade, evitando alterações adicionais se marcação é um nó pai do objeto alterado.

O Subversion também adicionou recursos, desde a versão 1.5, relacionados ao "rastreamento de mesclagem de ramificações" para que as alterações submetidas a um filial pode ser mesclado novamente no tronco com suporte para mesclagem incremental e "inteligente".

Outras dicas

Primeiro de tudo, como apontam @AndrewFinnell e @KenLiu, no SVN os nomes dos diretórios em si não significam nada - "tronco, ramificações e tags" são simplesmente uma convenção comum usada pela maioria dos repositórios.Nem todos os projetos usam todos os diretórios (é razoavelmente comum não usar "tags") e, na verdade, nada impede você de chamá-los do que quiser, embora quebrar as convenções seja muitas vezes confuso.

Descreverei provavelmente o cenário de uso mais comum de ramificações e tags e darei um exemplo de cenário de como eles são usados.

  • Porta-malas:A principal área de desenvolvimento.É aqui que reside o próximo grande lançamento do código e geralmente possui todos os recursos mais recentes.

  • Galhos:Cada vez que você lança uma versão principal, uma ramificação é criada.Isso permite que você corrija bugs e faça uma nova versão sem ter que lançar os recursos mais recentes - possivelmente inacabados ou não testados.

  • Tag:Cada vez que você lança uma versão (versão final, release candidate (RC) e betas), você cria uma tag para ela.Isso fornece uma cópia pontual do código como estava naquele estado, permitindo que você volte e reproduza quaisquer bugs, se necessário, em uma versão anterior ou relançar uma versão anterior exatamente como estava.Ramos e tags no SVN são leves - no servidor, ele não faz uma cópia completa dos arquivos, apenas um marcador dizendo "esses arquivos foram copiados nesta revisão" que ocupa apenas alguns bytes.Com isso em mente, você nunca deve se preocupar em criar uma tag para qualquer código lançado.Como eu disse anteriormente, as tags são frequentemente omitidas e, em vez disso, um changelog ou outro documento esclarece o número da revisão quando um lançamento é feito.


Por exemplo, digamos que você inicie um novo projeto.Você começa a trabalhar no “tronco”, no que eventualmente será lançado como versão 1.0.

  • trunk/ - versão de desenvolvimento, em breve 1.0
  • ramos/ - vazio

Assim que a versão 1.0.0 for concluída, você ramifica o tronco para uma nova ramificação "1.0" e cria uma tag "1.0.0".Agora o trabalho no que eventualmente será 1.1 continua no tronco.

  • tronco/ - versão de desenvolvimento, em breve será 1.1
  • filiais/1.0 - versão de lançamento 1.0.0
  • tags/1.0.0 - versão de lançamento 1.0.0

Você encontra alguns bugs no código, corrige-os no tronco e, em seguida, mescla as correções na ramificação 1.0.Você também pode fazer o oposto e corrigir os bugs no branch 1.0 e depois mesclá-los de volta ao tronco, mas normalmente os projetos se limitam à fusão unilateral apenas para diminuir a chance de perder alguma coisa.Às vezes, um bug só pode ser corrigido na versão 1.0 porque está obsoleto na versão 1.1.Realmente não importa:você só quer ter certeza de não lançar o 1.1 com os mesmos bugs que foram corrigidos no 1.0.

  • trunk/ - versão de desenvolvimento, em breve 1.1
  • filiais/1.0 - próxima versão 1.0.1
  • tags/1.0.0 - versão de lançamento 1.0.0

Depois de encontrar bugs suficientes (ou talvez um bug crítico), você decide fazer uma versão 1.0.1.Então você cria uma tag "1.0.1" do branch 1.0 e libera o código.Neste ponto, o tronco conterá o que será 1.1, e a ramificação “1.0” conterá o código 1.0.1.Na próxima vez que você lançar uma atualização para 1.0, será 1.0.2.

  • trunk/ - versão de desenvolvimento, em breve 1.1
  • filiais/1.0 - próxima versão 1.0.2
  • tags/1.0.0 - versão de lançamento 1.0.0
  • tags/1.0.1 - versão de lançamento 1.0.1

Eventualmente, você estará quase pronto para lançar o 1.1, mas deseja fazer uma versão beta primeiro.Nesse caso, você provavelmente fará uma ramificação "1.1" e uma tag "1.1beta1".Agora, o trabalho no que será 1.2 (ou 2.0 talvez) continua no tronco, mas o trabalho no 1.1 continua no ramo "1.1".

  • tronco/ - versão de desenvolvimento, em breve será 1,2
  • filiais/1.0 – próxima versão 1.0.2
  • filiais/1.1 – próxima versão 1.1.0
  • tags/1.0.0 - versão de lançamento 1.0.0
  • tags/1.0.1 - versão de lançamento 1.0.1
  • tags/1.1beta1 - versão de lançamento 1.1 beta 1

Depois de lançar a versão 1.1 final, você cria uma tag "1.1" no branch "1.1".

Você também pode continuar mantendo a versão 1.0 se desejar, portando correções de bugs entre todas as três ramificações (1.0, 1.1 e tronco).A conclusão importante é que, para cada versão principal do software que você mantém, você tem uma ramificação que contém a versão mais recente do código dessa versão.


Outro uso de ramificações é para recursos.É aqui que você ramifica o tronco (ou uma de suas ramificações de lançamento) e trabalha isoladamente em um novo recurso.Assim que o recurso for concluído, você o mescla novamente e remove a ramificação.

  • trunk/ - versão de desenvolvimento, em breve 1.2
  • filiais/1.1 – próxima versão 1.1.0
  • ramificações/reescrita da interface do usuário - ramificação de recurso experimental

A ideia disso é quando você está trabalhando em algo perturbador (que impediria ou interferiria no trabalho de outras pessoas), algo experimental (que pode nem funcionar) ou possivelmente apenas algo que leva muito tempo (e você tem medo de manter uma versão 1.2 quando estiver pronto para ramificar 1.2 do tronco), você pode fazer isso isoladamente na ramificação.Geralmente você o mantém atualizado com o trunk mesclando as alterações nele o tempo todo, o que torna mais fácil a reintegração (mesclagem de volta ao trunk) quando terminar.


Observe também que o esquema de controle de versão que usei aqui é apenas um entre muitos.Algumas equipes fariam lançamentos de correção/manutenção de bugs como 1.1, 1.2, etc., e mudanças importantes como 1.x, 2.x, etc.O uso aqui é o mesmo, mas você pode nomear a ramificação como "1" ou "1.x" em vez de "1.0" ou "1.0.x".(Aparte, versionamento semântico é um bom guia sobre como fazer números de versão).

Além do que Nick disse, você pode descobrir mais em Linhas transmitidas:Padrões de ramificação para desenvolvimento paralelo de software

enter image description here

Nesta figura main é o tronco, rel1-maint é um ramo e 1.0 é uma etiqueta.

Em geral (visão independente de ferramenta), uma ramificação é o mecanismo usado para desenvolvimento paralelo.Um SCM pode ter de 0 a n ramificações.Subversão tem 0.

  • Porta-malas é um ramo principal recomendado por Subversão, mas você não é de forma alguma forçado a criá-lo.Você poderia chamá-lo de 'principal' ou 'lançamentos', ou não ter nenhum!

  • Filial representa um esforço de desenvolvimento.Nunca deve receber o nome de um recurso (como 'vonc_branch'), mas sim:

    • um propósito 'myProject_dev' ou 'myProject_Merge'
    • um perímetro de lançamento 'myProjetc1.0_dev'ou myProject2.3_Merge' ou 'myProject6..2_Patch1'...
  • Marcação é um instantâneo dos arquivos para voltar facilmente a esse estado.O problema é que tag e branch são iguais no Subversion.E eu definitivamente recomendaria a abordagem paranóica:

    você pode usar um dos scripts de controle de acesso fornecidos com o Subversion para evitar que alguém faça qualquer coisa além de criar novas cópias na área de tags.

Uma etiqueta é definitiva.Seu conteúdo nunca deve mudar.NUNCA.Sempre.Você esqueceu uma linha na nota de lançamento?Crie uma nova etiqueta.Obsoleto ou remova o antigo.

Agora, eu li muito sobre "mesclar tal e tal em tal e tal ramo, e finalmente no ramo tronco".Isso é chamado mesclar fluxo de trabalho e aqui está nada obrigatório aqui.Não é porque você tem um branch trunk que você tem que mesclar de volta qualquer coisa.

Por convenção, o branch trunk pode representar o estado atual do seu desenvolvimento, mas isso é para um projeto sequencial simples, ou seja, um projeto que possui:

  • nenhum desenvolvimento 'antecipado' (para a preparação da próxima versão implicando tais mudanças que não são compatíveis com o desenvolvimento 'tronco' atual)
  • sem refatoração massiva (para testar uma nova escolha técnica)
  • nenhuma manutenção a longo prazo de uma versão anterior

Porque com um (ou todos) desses cenários, você obtém quatro 'troncos', quatro 'desenvolvimentos atuais', e nem tudo o que você faz nesses desenvolvimentos paralelos terá necessariamente que ser mesclado de volta no 'tronco'.

No SVN, uma tag e uma ramificação são realmente semelhantes.

Marcação = uma fatia definida no tempo, geralmente usada para lançamentos

Filial = também uma fatia definida no tempo em que o desenvolvimento pode continuar, geralmente usado para versões principais como 1.0, 1.5, 2.0, etc., então, quando você lançar, você marca o branch.Isso permite que você continue a oferecer suporte a uma versão de produção enquanto avança com alterações significativas no tronco

Porta-malas = espaço de trabalho de desenvolvimento, é aqui que todo o desenvolvimento deve acontecer e, em seguida, as alterações serão mescladas dos lançamentos das ramificações.

Eles realmente não têm nenhum significado formal.Uma pasta é uma pasta ao SVN.Eles são uma forma geralmente aceita de organizar seu projeto.

  • O tronco é onde você mantém sua linha principal de desenvolvimento.A pasta branch é onde você pode criar ramificações, que são difíceis de explicar em uma postagem curta.

  • Uma ramificação é uma cópia de um subconjunto do seu projeto no qual você trabalha separadamente do tronco.Talvez seja para experimentos que podem não levar a lugar nenhum, ou talvez seja para a próxima versão, que mais tarde você irá mesclar de volta ao tronco quando ele se tornar estável.

  • E a pasta tags serve para criar cópias marcadas do seu repositório, geralmente em pontos de verificação de lançamento.

Mas como eu disse, para o SVN uma pasta é uma pasta. branch, trunk e tag são apenas uma convenção.

Estou usando a palavra 'cópia' liberalmente.Na verdade, o SVN não faz cópias completas das coisas no repositório.

O porta-malas é a linha de desenvolvimento que contém o código-fonte e os recursos mais recentes.Ele deve conter as correções de bugs mais recentes, bem como os recursos mais recentes adicionados ao projeto.

O galhos geralmente são usados ​​para fazer algo fora do tronco (ou outra linha de desenvolvimento) que de outra forma seria quebrar a construção.Novos recursos geralmente são criados em uma ramificação e depois mesclados novamente no tronco.As ramificações geralmente contêm código que não é necessariamente aprovado para a linha de desenvolvimento da qual se ramificou.Por exemplo, um programador poderia tentar uma otimização em algo em uma ramificação e somente mesclar novamente na linha de desenvolvimento quando a otimização fosse satisfatória.

O Tag são instantâneos do repositório em um determinado momento.Nenhum desenvolvimento deve ocorrer nestes.Eles são mais frequentemente usados ​​para tirar uma cópia do que foi lançado para um cliente, para que você possa ter acesso facilmente ao que o cliente está usando.

Aqui está um link para um guia muito bom para repositórios:

Os artigos da Wikipedia também valem a pena ler.

Agora, esse é o problema do desenvolvimento de software: não há conhecimento consistente sobre nada, todo mundo parece fazer as coisas do seu jeito, mas isso é porque é uma disciplina relativamente jovem, de qualquer maneira.

Esta é a minha maneira simples e simples,

porta-malas - O diretório trunk contém o corpo de trabalho mais atual, aprovado e mesclado.Ao contrário do que muitos confessaram, meu baú é apenas para trabalhos limpos, arrumados e aprovados, e não uma área de desenvolvimento, mas sim uma área de liberação.

Em algum momento, quando o tronco parece pronto para ser liberado, ele é etiquetado e liberado.

galhos - O diretório de filiais contém experimentos e trabalhos em andamento.O trabalho em uma filial permanece lá até que seja aprovado para ser incorporado ao tronco.Para mim, esta é a área onde todo o trabalho é feito.

Por exemplo:eu posso ter um iteração-5 filial para uma quinta rodada de desenvolvimento do produto, talvez um protótipo-9 ramificar para uma nona rodada de experimentação e assim por diante.

Tag - O diretório tags contém instantâneos de filiais e versões de tronco aprovadas.Sempre que uma filial é aprovada para mesclar no tronco, ou uma liberação do tronco é feita, um instantâneo da filial aprovada ou da liberação do tronco é feito nas tags.

Suponho que com tags posso avançar e retroceder no tempo até pontos de interesse com bastante facilidade.

Encontrei este ótimo tutorial sobre SVN quando estava pesquisando o site do autor do OpenCV 2 Livro de receitas de programação de aplicativos de visão computacional e pensei que deveria compartilhar.

Ele tem um tutorial sobre como usar o SVN e o que significam as frases 'tronco', 'tag' e 'ramo'.

Citado diretamente de seu tutorial:

A versão atual do seu projeto de software, na qual sua equipe está trabalhando, geralmente está localizada em um diretório chamado porta-malas.À medida que o projeto evolui, o desenvolvedor atualiza essa versão, corrige bugs, adiciona novos recursos e envia suas alterações nesse diretório.

A qualquer momento, você pode querer congelar uma versão e capturar um instantâneo do software como ele está neste estágio de desenvolvimento.Geralmente corresponde às versões oficiais do seu software, por exemplo, aquelas que você entregará aos seus clientes.Esses instantâneos estão localizados sob o Tag diretório do seu projeto.

Finalmente, muitas vezes é útil criar, em algum momento, uma nova linha de desenvolvimento para o seu software.Isso acontece, por exemplo, quando você deseja testar uma implementação alternativa na qual precisa modificar seu software, mas não deseja submeter essas alterações ao projeto principal até decidir se adota a nova solução.A equipe principal pode então continuar trabalhando no projeto enquanto outros desenvolvedores trabalham no protótipo.Você colocaria essas novas linhas de desenvolvimento do projeto em um diretório chamado galhos.

O diretório trunk é o diretório com o qual você provavelmente está mais familiarizado, porque é usado para armazenar as alterações mais recentes.Sua base de código principal deve estar no tronco.

O diretório de filiais serve para armazenar suas filiais, sejam elas quais forem.

O diretório tags serve basicamente para marcar um determinado conjunto de arquivos.Você faz isso para coisas como lançamentos, onde deseja que "1.0" sejam esses arquivos nessas revisões e "1.1" sejam esses arquivos nessas revisões.Normalmente você não modifica as tags depois de criadas.Para obter mais informações sobre tags, consulte Capítulo 4.Ramificação e fusão (em Controle de versão com Subversion).

Uma das razões pelas quais todos têm uma definição ligeiramente diferente é porque o Subversion implementa zero suporte para ramificações e tags.O Subversion basicamente diz: Nós olhamos para completo ramificações e tags em outros sistemas e não as consideramos úteis, por isso não implementamos nada.Basta fazer uma cópia em um novo diretório com um nome convenção em vez de.Então é claro que todos são livres para ter convenções ligeiramente diferentes.Para entender a diferença entre um real e uma mera cópia + convenção de nomenclatura veja o verbete da Wikipédia Tags e ramificações do Subversion.

Tag = uma fatia definida no tempo, geralmente usada para lançamentos

Acho que é isso que normalmente se entende por "tag".Mas no Subversion:

Eles realmente não têm nenhum significado formal.Uma pasta é uma pasta para SVN.

o que acho bastante confuso:um sistema de controle de revisão que não sabe nada sobre ramificações ou tags.Do ponto de vista da implementação, acho que a maneira do Subversion de criar "cópias" é muito inteligente, mas ter que saber sobre isso é o que eu chamaria de abstração com vazamento.

Ou talvez eu esteja apenas usando CVS demasiado longo.

Acho que parte da confusão vem da diferença entre o conceito de tag e a implementação no SVN.Para o SVN, uma tag é uma ramificação que é uma cópia.Modificar tags é considerado errado e, de fato, ferramentas como o TortoiseSVN irão avisá-lo se você tentar modificar alguma coisa com ../tags/..no caminho.

Não tenho certeza do que é 'tag', mas branch é um conceito de controle de origem bastante comum.

Basicamente, um branch é uma forma de trabalhar nas alterações do código sem afetar o trunk.Digamos que você queira adicionar um novo recurso bastante complicado.Você deseja poder fazer check-in das alterações à medida que as faz, mas não quer que isso afete o tronco até que você conclua o recurso.

Primeiro você criaria um branch.Esta é basicamente uma cópia do tronco no momento em que você fez a ramificação.Você então faria todo o seu trabalho no ramo.Quaisquer alterações feitas no branch não afetam o trunk, então o trunk ainda pode ser usado, permitindo que outros continuem trabalhando lá (como fazer correções de bugs ou pequenas melhorias).Assim que seu recurso estiver concluído, você integrará o branch novamente ao tronco.Isso moveria todas as suas alterações do branch para o trunk.

Existem vários padrões que as pessoas usam para filiais.Se você tiver um produto com suporte para várias versões principais ao mesmo tempo, normalmente cada versão seria uma ramificação.Onde trabalho, temos uma filial de controle de qualidade e uma filial de produção.Antes de liberar nosso código para controle de qualidade, integramos as alterações na ramificação de controle de qualidade e, em seguida, implantamos a partir daí.Ao liberar para produção, integramos do ramo de controle de qualidade ao ramo de produção, portanto, sabemos que o código em execução na produção é idêntico ao que o controle de qualidade testou.

Aqui está o Entrada da Wikipedia sobre filiais, já que eles provavelmente explicam as coisas melhor do que eu.:)

Para pessoas familiarizadas com o GIT, master no GIT é equivalente a trunk no SVN.

Branch e tag têm a mesma terminologia no GIT e no SVN.

Porta-malas :Após a conclusão de cada sprint no ágil, obtemos um produto parcialmente entregável.Esses lançamentos são mantidos no tronco.

Galhos :Todos os códigos de desenvolvimento paralelo para cada sprint em andamento são mantidos em filiais.

Tag :Cada vez que lançamos uma versão beta de um produto parcialmente entregável, criamos uma tag para ele.Isso nos dá o código que estava disponível naquele momento, permitindo-nos voltar a esse estado, se necessário, em algum momento durante o desenvolvimento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top