Minha organização está considerando mudar do SVN para o Git. Um argumento contra a movimentação é o seguinte:
Como fazemos o versionamento?
Temos uma distribuição SDK baseada na plataforma NetBeans. Como as revisões do SVN são números simples, podemos usá-las para estender os números de versão de nossos plug-ins e compilações do SDK. Como lidamos com isso quando nos mudamos para o Git?
Soluções possíveis:
- Usando o número da compilação do Hudson (Problema: você precisa verificar o Hudson para correlacioná-lo a uma versão real do Git)
- Atualizando manualmente a versão para noturno e estável (Problema: Curva de aprendizado, erro humano)
Se alguém encontrou um problema semelhante e o resolveu, gostaríamos de saber como.
version-control
git
svn
builds
versioning
Erlend
fonte
fonte
git
tag após cada compilação bem-sucedida? Isso teria a vantagem adicional de deixar bem claro quaisgit
confirmações têm problemas de compilação ou falhas de teste, uma vez que permaneceriam sem marcação.Respostas:
Use tags para marcar confirmações com números de versão:
Push tags upstream - isso não é feito por padrão:
Em seguida, use o comando de descrição :
Isso fornece uma sequência do formato:
fonte
git describe --long --tags --dirty --always
. 'Dirty' dirá se houve alterações locais quando a 'descrição' foi feita (o que significa que não pode descrever completamente o estado do repo). "Sempre" significa que você não receberá um erro quando não houver tags. Ele fará o fallback para apenas um hash de confirmação. Então você pode obter76001f2-dirty
como exemplo. Obviamente, ver 'sujo' significa que alguém estragou tudo.HEAD
comov2.5
, também poderá interpretá-lo como o início do ciclo de lançamento do 2.5 e depois marcarv2.5-release
ou o que quiser.--match
opção assim:git describe --long --tags --dirty --always --match 'v[0-9]\.[0-9]'
Isso surgiu em alguns projetos para mim. A melhor solução que eu tive até agora é gerar um número de versão como este:
xy <número de confirmações> .r <git-hash>
Normalmente, é gerado pelo nosso sistema de compilação usando uma combinação de algum arquivo ou tag estático para obter os principais números de revisão
git rev-list HEAD | wc -l
(que foi mais rápido do que usargit log
) egit rev-parse HEAD
. O raciocínio foi o seguinte:O número 2 é invisível para a maioria das pessoas, mas é realmente importante e muito difícil com o controle de fonte distribuído. O SVN ajuda nisso, fornecendo um único número de revisão. Acontece que uma contagem de confirmação é o mais próximo possível, enquanto magicamente resolve o número 4. Na presença de ramificações, isso ainda não é exclusivo; nesse caso, adicionamos o hash, que também resolve o problema # 3.
A maior parte disso foi para acomodar a implantação via pip do Python. Isso garantiu que
pip install
talvez fosse um pouco estranho durante o desenvolvimento paralelo (ou seja, pacotes de pessoas em diferentes ramos se misturariam, mas de maneira determinística), mas que, após a fusão, tudo se resolveu. Exceto a presença de uma rebase ou alteração exposta, isso funcionou muito bem para os requisitos acima.Caso você esteja se perguntando, optamos por colocar r na frente do hash devido a alguma estranheza na maneira como o pacote Python lida com letras nos números de versão (ou seja, ae é menor que 0, o que tornaria "1.3.10.a1234" < "1.3.10" <"1.3.10.1234").
fonte
Isso pode ser um pouco exagerado, mas informarei como o fazemos.
Usamos uma estrutura de ramificação muito semelhante a isso .
O Hudson cria nossas ramificações "desenvolvidas" e aumenta os números de compilação a partir de 0. O número da compilação é exclusivo para cada projeto e é marcado no controle de versão. O motivo é para que você possa dizer exatamente de qual criação de ramificação de desenvolvimento 42 veio, por exemplo (cada projeto pode ter várias ramificações de desenvolvimento em paralelo, porque cada projeto pode ter várias equipes trabalhando em diferentes aspectos do projeto).
Quando decidimos que uma compilação específica é boa o suficiente para ser liberada, a confirmação que acionou essa compilação é marcada com um número de versão da release, que é decidido pelo marketing. Isso significa que as equipes de desenvolvimento não se importam com o número da versão final e o marketing é livre para alternar entre os números de versão como entender. O número da versão final e o número da compilação estão presentes no produto lançado.
Exemplo: 2.1.0 build 1337
Isso significa que, para uma versão específica do produto, você pode dizer qual foi a última equipe a trabalhar nela e pode consultar o git para todas as confirmações que antecederam a liberação para diagnosticar um problema, se necessário.
fonte
As versões são identificadas com hash SHA1 de todos os arquivos na árvore de diretórios armazenados no momento do check-in. Esse hash é armazenado juntamente com os hashes do (s) check-in (s) pai (s), para que o histórico completo possa ser lido.
Dê uma olhada no processo de usar 'git-description' por meio do GIT-VERSION-GEN e como você pode adicionar isso através do processo de compilação ao marcar seu release.
Aqui está um bom blog que fornece um exemplo de como obter o que você deseja:
http://cd34.com/blog/programming/using-git-to-generate-an-automatic-version-number/
fonte
Jon Purdy tem a ideia certa.
git flow
facilita também o gerenciamento real dessas filiais, e o gerenciamento de filiais é um argumento para mudar paragit
.Vamos começar com um resumo básico de
git
, desde que você está vindo dosvn
Para-git
perspectiva. Consideregit
o seguinte:Acima, você ramifica
master
paradevelop
(indicado por\
) e ramificadevelop
para umafeature
ramificação. Mesclamos esses ramos de backup (denotados por/
), com commits (-
) ao longo de um ramo. (Se não houver confirmação, mas a mesclagem estiver na direita, há.
indicadores para mostrar que a próxima-
é a próxima confirmação).Bastante fácil. E se tivermos um hotfix em nossa versão principal?
Acima,
develop
ramificado demaster
. O bug descoberto emmaster
foi corrigido ramificando-omaster
, corrigindo-o e mesclando-o novamentemaster
. Em seguida, fundiumaster
paradevelop
, em seguida,develop
emfeature2
que rolou o novo código dehotfix
dentro desses ramos.Quando você mescla
feature2
de volta paradevelop
, a sua história incluidevelop
ohotfix
. Da mesma forma,develop
é mescladofeature2
com o novo código demaster
, portanto, mesclar dedevelop
volta paramaster
acontecerá sem problemas, pois ele é baseado nesse commitmaster
naquele momento - como se você tivesse ramificadomaster
naquele momento.Então, aqui está outra maneira de fazer isso.
Suas 1.0 lançamentos obter tagged-
1.0.1
,1.0.2
,1.0.3
, e assim por diante.Agora, aqui está um truque: você encontrou um bug na versão 1.0 e afeta 1.1, 1.2 e 1.3. O que você faz?
Você ramifica a versão mais recente ou mais antiga mantida e a corrige. Então você mesclar seu novo
hotfix
ramo em1.3
-e em1.2
,1.1
, e1.0
. Não ramifique de cada uma das ramificações da versão de manutenção; não se fundem1.0
emmaster
ou fundirmaster
para trás em1.0
. Pegue o únicohotfix
ramo e mescle-o em todos os seus ramos de versão. Se houver conflitos, será informado; revise seu código para garantir que as alterações estejam corretas (git diff
é seu amigo).Agora essa mudança específica é aplicada em qualquer lugar. A linhagem é ramificada, mas está tudo bem. Não é casual. Marque a
1.3
cabeça como 1.3.17, mescle-a em todos os recursos em andamento ramificados1.3
e siga em frente.A
git flow
extensão ajuda a gerenciar essas ramificações de manutenção, recursos e hotfix para você. Depois de baixar o fluxo de trabalho, isso é trivial e gera uma enorme quantidade de problemas no gerenciamento de código-fonte.Já vi isso nas equipes de programação, mas também não trabalhei tão profundamente como programador; portanto, ainda estou estudando o fluxo de trabalho do dia-a-dia.
fonte
O Pro Git na seção 7.2 "Atributos Git" na parte de expansão "Palavra-chave" contém um bom exemplo de uso de filtros de manchas e limpeza para gerar palavras-chave no estilo RCS. Você pode usar a mesma técnica para incorporar alguma string de versão no código, formatado e calculado de acordo com suas regras . Você ainda pode usar
git describe
como ponto de partida, mas tem a possibilidade de se transformar em qualquer forma mais apropriada e obter da versão 2.5-14-14, por exemplo, limpar 2.5.14fonte
git describe
gera o nome da tag, a menos que--long
seja passado ou haja confirmações desde a última tag, portanto já está perfeitamente limpo. Se você não estivesse alterando os padrões, isso lhe daria exatamente o que você queria.