Usamos SVN en el trabajo, pero para mis proyectos personales decidí usar Git. Así que instalé Git ayer, y me pregunto cuál es el número de revisión equivalente en Git .
Digamos que trabajamos en la versión 3.0.8 y cada corrección de errores tiene su propio número de revisión que podemos usar cuando hablamos de esta corrección de errores. Entonces, si etiqueto el código en Git a 3.0.8, ¿qué puedo usar como número de revisión o algún otro tipo de identificación más detallado? Me parece que el hash no es tan fácil de usar para los humanos.
Respuestas:
Buenas o malas noticias para ti, ese hash ES el número de revisión. También tuve problemas con esto cuando hice el cambio de SVN a git.
Puede usar "etiquetar" en git para etiquetar una determinada revisión como "lanzamiento" para una versión específica, lo que facilita la referencia a esa revisión. Mira esta publicación de blog .
La clave para entender es que git no puede tener números de revisión: piense en la naturaleza descentralizada. Si los usuarios A y B se comprometen con sus repositorios locales, ¿cómo puede git asignar razonablemente un número de revisión secuencial? A no tiene conocimiento de B antes de que empujen / tiren de los cambios del otro.
Otra cosa a tener en cuenta es la ramificación simplificada para las ramas de corrección de errores:
Comience con una versión: 3.0.8. Luego, después de ese lanzamiento, haga esto:
Esto creará una rama para la corrección de errores. Pagar la sucursal:
Ahora realice los cambios de corrección de errores que desee.
Compromételos y vuelve a la rama maestra:
Luego, aplique esos cambios desde la otra rama:
De esa manera, tiene una rama de corrección de errores específica de la versión separada, pero aún está arrastrando los cambios de corrección de errores en su tronco de desarrollo principal.
fuente
fixed in 547cc3e..c4b2eba
, y tiene alguna otra revisión, ¡no tiene idea de si su código debe contener o no la solución! Seguramente los gits en git-central tienen una solución para esto?!?!Con Git moderno (1.8.3.4 en mi caso) y sin usar ramas, puede hacer:
fuente
git rev-list --count --first-parent HEAD
git rev-list --count HEAD
función de cuándo se realizaron los últimos empujones y tirones.--first-parent
aborda su preocupación? Odiaría evitar una solución aparentemente más simple debido a un caso marginal poco común si existe una solución o una forma igualmente simple de hacerlo más robusto.--first-parent
ayuda. Siempre que no se realice un rebase y se use siempre la misma rama para hacer lanzamientos (y calcular este número de lanzamiento, por supuesto), creo que esto podría usarse. Sin embargo, todavía no estoy seguro de que siempre identifique de manera única el compromiso del que proviene el lanzamiento. Hay tantas cosas que pueden salir mal aquí ... pero por el momento no puedo pensar en algo que definitivamente rompa esto (dadas mis declaraciones anteriores "siempre y cuando"). Elgit describe
método mencionado en otra respuesta es el camino a seguir. Crea una etiqueta si quieres algo legible por humanos.El
git describe
comando crea un nombre ligeramente más legible para humanos que se refiere a una confirmación específica. Por ejemplo, de la documentación:Siempre que use etiquetas con nombres razonables para etiquetar lanzamientos particulares, esto puede considerarse aproximadamente equivalente a un "número de revisión" SVN.
fuente
git
repositorio ya tiene etiquetas; de lo contrario, es posible que git describe falle con "fatal: no se encontraron nombres, no se puede describir nada". - Desbordamiento de pila ; lo que significa que tendría que configurar las etiquetas usted mismo.git describe
fallar nunca, use lagit describe --always
opcióngit describe
puede usar la salida de para encontrar la confirmación de origen, de alguna manera? A falta de contar manualmente las confirmaciones en el registro, quiero decir.v1.0.4
) como la identificación de confirmación más reciente (2414721
) ya forman parte de la salida de git describe.Los otros carteles tienen razón, no hay un "número de revisión".
¡Creo que la mejor manera es usar etiquetas para "lanzamientos"!
Pero hice uso de los siguientes números de revisión falsos (solo para que los clientes vean las revisiones y el progreso, ya que querían tener las mismas revisiones crecientes de git que las que usaban por subversión).
Mostrar la "revisión actual" de "HEAD" se simula usando esto:
git rev-list HEAD | wc -l
Pero, ¿qué pasa si el cliente me dice que hay un error en la "revisión" 1302?
Para esto, agregué lo siguiente a la sección [alias] de mi ~ / .gitconfig:
show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'
usando
git show-rev-number 1302
luego imprimirá el hash para la "revisión" :)Hice una publicación de blog (en alemán) sobre esa "técnica" hace algún tiempo.
fuente
git bisect
(enlace) es la herramienta adecuada para identificar qué cambió cuándo quién lo cambió.git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Git no tiene el mismo concepto de números de revisión que subversión. En cambio, cada instantánea realizada con una confirmación se etiqueta con una suma de verificación SHA1. ¿Por qué? Existen varios problemas con un revno en ejecución en un sistema de control de versiones distribuido:
Primero, dado que el desarrollo no es lineal en absoluto, la fijación de un número es bastante difícil como un problema para resolver de una manera que satisfaga su necesidad como programador. Intentar arreglar esto agregando un número puede volverse problemático rápidamente cuando el número no se comporta como espera.
En segundo lugar, se pueden generar números de revisión en diferentes máquinas. Esto hace que la sincronización de números sea mucho más difícil, especialmente porque la conectividad es unidireccional; Es posible que ni siquiera tenga acceso a todas las máquinas que tienen el repositorio.
En tercer lugar, en git, algo pionero por el sistema OpenCM ahora desaparecido, la identidad de un commit (lo que es el commit) es equivalente a su nombre (la identificación SHA). Este concepto de denominación = identidad es muy fuerte. Cuando te sientas con un nombre de confirmación en la mano, también identifica la confirmación de una manera inolvidable. Esto a su vez le permite verificar todas sus confirmaciones hasta la primera inicial para detectar daños con el
git fsck
comando.Ahora, dado que tenemos un DAG (Gráfico Acíclico Dirigido) de revisiones y estas constituyen el árbol actual, necesitamos algunas herramientas para resolver su problema: ¿Cómo discriminamos las diferentes versiones? Primero, puede omitir parte del hash si un prefijo dado, digamos 1516bd , identifica de manera exclusiva su confirmación. Pero esto también es bastante artificial. En cambio, el truco es usar etiquetas y / o ramas. Una etiqueta o rama es similar a una "nota adhesiva amarilla" que adjunta a una confirmación SHA1-id determinada. Las etiquetas, en esencia, están destinadas a no moverse, mientras que una rama se moverá cuando se realicen nuevos compromisos en su HEAD. Hay formas de referirse a un commit alrededor de una etiqueta o rama, vea la página de manual de git-rev-parse.
Por lo general, si necesita trabajar en una parte específica del código, esa parte está experimentando cambios y, como tal, debe ser una rama con un nombre de tema que diga. La creación de muchas ramas (20-30 por programador no es desconocido, con unas 4-5 publicadas para que otros trabajen) es el truco para un git efectivo. Cada trabajo debe comenzar como su propia rama y luego fusionarse cuando se prueba. Las ramas no publicadas pueden reescribirse por completo y esta parte de destruir la historia es una fuerza de git.
Cuando el cambio se acepta en maestro, se congela y se convierte en arqueología. En ese punto, puede etiquetarlo, pero con mayor frecuencia se hace una referencia a la confirmación particular en un rastreador de errores o rastreador de problemas a través de la suma sha1. Las etiquetas tienden a estar reservadas para los baches de versión y los puntos de ramificación para las ramificaciones de mantenimiento (para versiones antiguas).
fuente
Si está interesado, administré los números de versión automáticamente desde git infos aquí bajo el formato
donde build es el número total de commits. Verá el código interesante en el
Makefile
. Aquí está la parte relevante para acceder a la parte diferente del número de versión:fuente
Una función Bash:
produce algo como
Es decir
fuente
El hash SHA1 de la confirmación es el equivalente a un número de revisión de Subversion.
fuente
Esto es lo que hice en mi archivo MAKE basado en otras soluciones. Tenga en cuenta que esto no solo le da a su código un número de revisión, sino que también agrega el hash que le permite recrear la versión.
fuente
git-describe
para evitar errores es con lagit describe --always --dirty --long --tags
que funciona en todos los casos que se me ocurren.El problema con el uso del git hash como número de compilación es que no está aumentando monotónicamente. OSGi sugiere usar una marca de tiempo para el número de compilación. Parece que el número de confirmaciones a la rama podría usarse en lugar del número de subversión o cambio de fuerza.
fuente
Escribí algunas utilidades de PowerShell para recuperar información de versión de Git y simplificar el etiquetado
funciones: Get-LastVersion, Get-Revision, Get-NextMajorVersion, Get-NextMinorVersion, TagNextMajorVersion, TagNextMinorVersion:
fuente
Cada commit tiene un hash único. Aparte de eso, no hay números de revisión en git. Tendrá que etiquetar las confirmaciones usted mismo si desea una mayor facilidad de uso.
fuente
Solo me gustaría señalar otro enfoque posible, y eso es mediante el uso de
git
git-notes (1) , existente desde v 1.6.6 ( Note to Self - Git ) (estoy usando lagit
versión 1.7.9.5).Básicamente, solía
git svn
clonar un repositorio SVN con historial lineal (sin diseño estándar, sin ramas, sin etiquetas), y quería comparar los números de revisión en elgit
repositorio clonado . Este clon de git no tiene etiquetas por defecto, por lo que no puedo usarlogit describe
. La estrategia aquí probablemente funcionaría solo para la historia lineal, no estoy seguro de cómo resultaría con fusiones, etc .; Pero aquí está la estrategia básica:git rev-list
una lista de todos los historiales de confirmaciónrev-list
está por defecto en "orden cronológico inverso", usaríamos su--reverse
interruptor para obtener la lista de confirmaciones ordenadas por las más antiguas primerobash
shell paragit log
with--notes
, que también volcará una nota de confirmación, que en este caso sería el "número de revisión"git status
)Primero, observemos que
git
tiene una ubicación predeterminada de notas, pero también puede especificar unaref
(diferencia) para las notas, que las almacenaría en un directorio diferente en.git
; por ejemplo, mientras está en unagit
carpeta de repositorio, puede llamargit notes get-ref
para ver qué directorio será:Lo que debe tenerse en cuenta es que si
notes add
tiene un--ref
, también debe usar esa referencia nuevamente; de lo contrario, puede obtener errores como " No se encontró nota para el objeto XXX ... ".Para este ejemplo, he elegido llamar a las
ref
notas "linrev" (para revisión lineal); esto también significa que no es probable que el procedimiento interfiera con las notas ya existentes. También estoy usando el--git-dir
interruptor, ya que siendo ungit
novato, tuve algunos problemas para entenderlo, así que me gustaría "recordar para más adelante":)
; y también uso--no-pager
para suprimir el desoveless
cuando lo usogit log
.Entonces, suponiendo que esté en un directorio, con una subcarpeta
myrepo_git
que es ungit
repositorio; uno podría hacer:Entonces, al menos en mi caso específico de historia completamente lineal sin ramificaciones, los números de revisión parecen coincidir con este enfoque, y además, parece que este enfoque permitirá usar
git log
con rangos de revisión, mientras sigue obteniendo los números de revisión correctos: YMMV con un contexto diferente, aunque ...Espero que esto ayude a alguien,
¡salud!
EDITAR: Ok, aquí es un poco más fácil, con
git
alias para los bucles anteriores, llamadosetlinrev
yunsetlinrev
; cuando esté en su carpeta de repositorio de git, haga ( Note el desagradablebash
escape, vea también # 16136745 - Agregue un alias de Git que contenga un punto y coma ):... para que pueda simplemente invocar
git setlinrev
antes de intentar hacer un registro con notas de revisión lineal; ygit unsetlinrev
para eliminar esas notas cuando haya terminado; un ejemplo desde dentro del directorio git repo:El tiempo que le llevaría al shell completar estos alias dependería del tamaño del historial del repositorio.
fuente
Para las personas que tienen un proceso de compilación Ant , puede generar un número de versión para un proyecto en git con este objetivo:
El resultado se ve así:
El indicador sucio está aquí cuando tiene archivos no confirmados cuando genera el número de versión. Porque generalmente, cuando compila / empaqueta su aplicación, cada modificación de código debe estar en el repositorio.
fuente
¿Junto con la identificación SHA-1 de la confirmación, la fecha y la hora de la hora del servidor habrían ayudado?
Algo como esto:
fuente
Del manual de Git, las etiquetas son una respuesta brillante a este problema:
Consulte 2.6 Conceptos básicos de Git: etiquetado
fuente
By default, the git push command doesn’t transfer tags to remote servers.
Estamos usando este comando para obtener la versión y la revisión de git:
Vuelve
gcc7b71f
)v2.1.0
. ej. , utilizada para lanzamientos)v5.3.0-88-gcc7b71f
. ej. )v5.3.0-88-gcc7b71f-dirty
)Ver también: https://www.git-scm.com/docs/git-describe#Documentation/git-describe.txt
fuente
Evento posterior a la compilación para Visual Studio
fuente
Considere usar
git-rev-label
Proporciona información sobre la revisión del repositorio de Git en formato como
master-c73-gabc6bec
. Puede llenar una cadena de plantilla o un archivo con variables de entorno e información de Git. Útil para proporcionar información sobre la versión del programa: rama, etiqueta, hash de confirmación, recuento de confirmaciones, estado sucio, fecha y hora. Una de las cosas más útiles es el recuento de confirmaciones, sin tener en cuenta las ramas fusionadas, solo el primer padre.fuente