Usamos o SVN no trabalho, mas para meus projetos pessoais, decidi usar o Git. Então eu instalei o Git ontem e me pergunto qual é o número de revisão equivalente no Git .
Digamos que trabalhemos na versão 3.0.8 e cada correção de bug possui seu próprio número de revisão que podemos usar quando falamos sobre essa correção. Então, se eu codifico o código no Git para 3.0.8, o que posso usar como número de revisão ou algum outro tipo de identificação mais detalhado? Acho que o hash não é tão amigável para os seres humanos.
Respostas:
Boas ou más notícias para você, esse hash é o número da revisão. Eu também tive problemas com isso quando mudei de SVN para git.
Você pode usar "marcação" no git para marcar uma determinada revisão como "liberação" para uma versão específica, facilitando a consulta a essa revisão. Confira esta postagem no blog .
A principal coisa a entender é que o git não pode ter números de revisão - pense na natureza descentralizada. Se os usuários A e B estão se comprometendo com seus repositórios locais, como o git pode atribuir razoavelmente um número de revisão seqüencial? A não tem conhecimento de B antes de empurrar / puxar as mudanças um do outro.
Outra coisa a considerar é a ramificação simplificada para ramos de correção de bugs:
Comece com um release: 3.0.8. Depois desse lançamento, faça o seguinte:
Isso criará um ramo para correções de bugs. Faça o checkout da filial:
Agora faça as alterações desejadas.
Confirme-os e volte para a ramificação principal:
Em seguida, puxe essas alterações do outro ramo:
Dessa forma, você tem um ramo de correção de bug específico para a versão em separado, mas ainda está inserindo as alterações da correção de bug no seu principal tronco de desenvolvimento.
fonte
fixed in 547cc3e..c4b2eba
, e você tiver alguma outra revisão, você não tem idéia se o seu código deve ou não conter a correção ?! Certamente os gits do git-central têm uma solução para isso?!?!Com o Git moderno (1.8.3.4 no meu caso) e não usando branches, você pode:
fonte
git rev-list --count --first-parent HEAD
git rev-list --count HEAD
dependendo de quando os últimos push e pull foram feitos.--first-parent
endereço para sua preocupação? Eu odiaria evitar uma solução aparentemente mais simples por causa de um caso raro, se houver uma solução igualmente simples ou uma maneira de torná-la mais robusta.--first-parent
ajuda. Contanto que não seja feito o rebaseamento e o mesmo ramo seja sempre usado para fazer lançamentos (e para calcular esse número, é claro), acho que isso poderia ser usado. No entanto, ainda estou incerto de que sempre identificaria exclusivamente o commit de onde o lançamento veio. Há tantas coisas que podem dar errado aqui ... mas, no momento, não consigo pensar em algo que definitivamente iria quebrar isso (considerando minhas declarações "contanto que" acima). Ogit describe
método mencionado em outra resposta é o caminho a percorrer. Crie uma tag se quiser algo legível por humanos.O
git describe
comando cria um nome legível um pouco mais humano que se refere a um commit específico. Por exemplo, da documentação:Desde que você use tags com nome sensato para marcar versões específicas, isso pode ser considerado aproximadamente equivalente a um "número de revisão" do SVN.
fonte
git
repositório já tiver tags; caso contrário, você poderá obter uma falha no git description com "fatal: nenhum nome encontrado, não pode descrever nada". - Estouro de pilha ; o que significa que você teria que configurar as tags por conta própria.git describe
nunca falhar, use agit describe --always
opçãogit describe
ser usada para encontrar a fonte confirmada, de alguma forma? Falta menos de contagem manual de confirmações no log, quero dizer.v1.0.4
) quanto o id de confirmação mais recente (2414721
) já fazem parte da saída de descrição do git.Os outros pôsteres estão certos, não há "número de revisão".
Eu acho que a melhor maneira é usar tags para "lançamentos"!
Mas usei o seguinte para falsificar os números de revisão (apenas para os clientes verem as revisões e o progresso, pois eles queriam ter as mesmas revisões crescentes do git do que costumavam usar por subversão).
Mostre que a "revisão atual" de "HEAD" é simulada usando o seguinte:
git rev-list HEAD | wc -l
Mas e se o cliente me disser que há um erro na "revisão" 1302?
Para isso, adicionei o seguinte à seção [alias] do meu ~ / .gitconfig:
show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'
usando
git show-rev-number 1302
imprimirá o hash para a "revisão" :)Fiz uma postagem no blog (em alemão) sobre essa "técnica" há algum tempo.
fonte
git bisect
(link) é a ferramenta apropriada para identificar o que mudou quando e por quem.git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Git não tem o mesmo conceito de números de revisão que subversão. Em vez disso, cada instantâneo fornecido com uma confirmação é marcado por uma soma de verificação SHA1. Por quê? Existem vários problemas com um revno em execução em um sistema de controle de versão distribuído:
Primeiro, como o desenvolvimento não é linear, o anexo de um número é bastante difícil como um problema para resolver de uma maneira que satisfaça sua necessidade como programador. Tentar corrigir isso adicionando um número pode rapidamente se tornar problemático quando o número não se comporta conforme o esperado.
Segundo, os números de revisão podem ser gerados em máquinas diferentes. Isso torna a sincronização de números muito mais difícil - especialmente porque a conectividade é unidirecional; você pode nem ter acesso a todas as máquinas que possuem o repositório.
Terceiro, no git, pioneiro no sistema OpenCM, agora extinto, a identidade de uma confirmação (o que é a confirmação) é equivalente ao seu nome (o ID SHA). Esse conceito de nomeação = identidade é muito forte. Quando você se senta com um nome de confirmação na mão, ele também identifica o commit de uma maneira imperdoável. Isso, por sua vez, permite que você verifique todas as suas confirmações de volta à primeira inicial quanto à corrupção com o
git fsck
comandoAgora, como temos um DAG (gráfico acíclico direcionado) e essas constituem a árvore atual, precisamos de algumas ferramentas para resolver seu problema: Como discriminamos versões diferentes. Primeiro, você pode omitir parte do hash se um determinado prefixo, 1516bd , identifica exclusivamente seu commit. Mas isso também é bastante artificial. Em vez disso, o truque é usar tags e ou branches. Uma tag ou ramificação é semelhante a uma "nota amarela" anexada a um determinado ID SHA1 de confirmação. Tags são, em essência, destinadas a não serem movidas, enquanto um ramo se moverá quando novas confirmações forem feitas em seu HEAD. Existem maneiras de se referir a um commit em torno de uma tag ou ramificação, consulte a página de manual do git-rev-parse.
Geralmente, se você precisar trabalhar em um trecho de código específico, esse trecho está passando por alterações e, como tal, deve ser um ramo com um nome de tópico dizendo. Criar muitas ramificações (20 a 30 por programador não é algo inédito, com algumas 4-5 publicadas para que outras pessoas possam trabalhar) é o truque para um git eficaz. Todo trabalho deve começar como seu próprio ramo e depois ser mesclado quando for testado. Ramos não publicados podem ser reescritos inteiramente e essa parte da destruição da história é uma força do git.
Quando a mudança é aceita no mestre, ela congela um pouco e se torna arqueologia. Nesse ponto, você pode marcá-lo, mas com mais freqüência é feita uma referência ao commit específico em um rastreador de erros ou rastreador de problemas por meio da soma sha1. As tags tendem a ser reservadas para bumps de versão e pontos de ramificação para ramificações de manutenção (para versões antigas).
fonte
Se você estiver interessado, gerenciei números de versão automaticamente a partir de informações do git aqui, no formato
onde build é o número total de confirmações. Você verá o código interessante no
Makefile
. Aqui está a parte relevante para acessar a parte diferente do número da versão:fonte
Uma função Bash:
produz algo como
Isso é
fonte
O hash SHA1 do commit é equivalente a um número de revisão do Subversion.
fonte
Foi o que fiz no meu makefile com base em outras soluções. Observe que isso não apenas fornece ao seu código um número de revisão, mas também anexa o hash, que permite recriar a versão.
fonte
git-describe
para evitar erros, é com agit describe --always --dirty --long --tags
qual funciona em todos os casos em que consigo pensar.O problema com o uso do hash git como número de compilação é que ele não está aumentando monotonicamente. OSGi sugere usar um carimbo de data / hora para o número da compilação. Parece que o número de confirmações no ramo poderia ser usado no lugar do número de alteração subversion ou forforce.
fonte
Escrevi alguns utilitários do PowerShell para recuperar informações de versão do Git e simplificar a marcação
funções: Get-LastVersion, Get-Revisão, Get-NextMajorVersion, Get-NextMinorVersion, TagNextMajorVersion, TagNextMinorVersion:
fonte
Cada confirmação possui um hash exclusivo. Fora isso, não há números de revisão no git. Você terá que marcar confirmações se quiser mais facilidade de uso.
fonte
Gostaria apenas de observar outra abordagem possível - e isso é usando o
git
git-notes (1) , existente desde a v 1.6.6 ( Note to Self - Git ) (estou usando agit
versão 1.7.9.5).Basicamente, eu costumava
git svn
clonar um repositório SVN com histórico linear (sem layout padrão, sem ramificações, sem tags) e queria comparar os números de revisão nogit
repositório clonado . Esse clone do git não tem tags por padrão, então não posso usá-logit describe
. A estratégia aqui provavelmente funcionaria apenas para o histórico linear - não tenho certeza de como seria o resultado das fusões, etc .; mas aqui está a estratégia básica:git rev-list
uma lista de todo o histórico de consolidaçãorev-list
por padrão, está em "ordem cronológica reversa", usaríamos sua--reverse
opção para obter a lista de confirmações ordenadas pela mais antiga primeirobash
shell paragit log
with--notes
, que também irá despejar a nota de uma confirmação, que nesse caso seria o "número da revisão"git status
)Primeiro, vamos observar que
git
possui um local padrão de anotações - mas você também pode especificar umaref
(referência) para anotações - que as armazenaria em um diretório diferente em.git
; por exemplo, enquanto estiver em umagit
pasta de repo, você pode ligargit notes get-ref
para ver qual diretório será:A única coisa a se notar é que se você
notes add
com um--ref
, você também deve usar depois que a referência novamente - caso contrário você pode obter erros como " Sem nota encontrada para o objeto XXX ... ".Neste exemplo, eu escolhi chamar as
ref
notas de "linrev" (para revisão linear) - isso também significa que não é provável que o procedimento interfira nas notas já existentes. Também estou usando o--git-dir
switch, desde quegit
eu era novato, tive alguns problemas para entendê-lo - então eu gostaria de "lembrar para mais tarde":)
; e eu também uso--no-pager
para suprimir a desovaless
ao usargit log
.Então, supondo que você esteja em um diretório, com uma subpasta
myrepo_git
que seja umgit
repositório; alguém poderia fazer:Portanto, pelo menos no meu caso específico de histórico totalmente linear sem ramificações, os números de revisão parecem coincidir com essa abordagem - e, além disso, parece que essa abordagem permitirá o uso
git log
com intervalos de revisão e, ao mesmo tempo, os números de revisão corretos - YMMV com um contexto diferente, embora ...Espero que isso ajude alguém,
Saúde!
EDIT: Ok, aqui é um pouco mais fácil, com
git
aliases para os loops acima, chamadossetlinrev
eunsetlinrev
; quando estiver na sua pasta de repositório git, faça ( observe obash
escape desagradável , consulte também # 16136745 - Adicione um alias do Git contendo um ponto-e-vírgula ):... para que você possa simplesmente chamar
git setlinrev
antes de tentar fazer log envolvendo notas de revisão lineares; egit unsetlinrev
excluir essas anotações quando terminar; um exemplo de dentro do diretório git repo:O tempo que o shell levaria para concluir esses aliases dependeria do tamanho do histórico do repositório.
fonte
Para pessoas que têm um processo de construção do Ant , você pode gerar um número de versão para um projeto no git com este destino:
O resultado fica assim:
O sinalizador sujo está aqui quando você possui arquivos não confirmados ao gerar o número da versão. Como geralmente, quando você constrói / empacota seu aplicativo, todas as modificações de código precisam estar no repositório.
fonte
Juntamente com o ID SHA-1 da confirmação, a data e a hora da hora do servidor teriam ajudado?
Algo assim:
fonte
No manual do Git, as tags são uma resposta brilhante para esse problema:
Confira 2.6 Noções básicas do Git - Etiquetagem
fonte
By default, the git push command doesn’t transfer tags to remote servers.
Estamos usando este comando para obter versão e revisão do git:
Retorna
gcc7b71f
)v2.1.0
, usada para liberações)v5.3.0-88-gcc7b71f
)v5.3.0-88-gcc7b71f-dirty
)Consulte também: https://www.git-scm.com/docs/git-describe#Documentation/git-describe.txt
fonte
Evento pós-compilação para o Visual Studio
fonte
Considere usar
git-rev-label
Dá informações sobre a revisão do repositório Git em formato como
master-c73-gabc6bec
. Pode preencher uma string ou arquivo de modelo com variáveis de ambiente e informações do Git. Útil para fornecer informações sobre a versão do programa: ramificação, etiqueta, hash de confirmação, contagem de confirmações, status sujo, data e hora. Uma das coisas mais úteis é a contagem de confirmações, sem levar em consideração as ramificações mescladas - apenas o primeiro pai.fonte