2010-05-19 11 views
43

Actualmente estoy usando una colección de tres comandos para obtener la etiqueta actual, la rama y la fecha y SHA1 de la confirmación más reciente.¿Hay un único comando de Git para obtener la etiqueta, bifurcación y confirmación actuales?

git describe --always --tag 
git log -1 --format="%H%n%aD" 
git rev-parse --abbrev-ref HEAD 

Qué sería algo así como:

1.2.3-5-gdeadbeef 
deadbeef3b8d90071c24f51ac8f26ce97a72727b 
Wed, 19 May 2010 09:12:34 +0200 
master 

Para ser honesto, estoy totalmente de acuerdo con esto. Pero estoy usando estos comandos de Maven y de cualquier persona que haya usado Maven antes, sabe cuánto cosas como comandos externos inflan el POM. Solo quiero adelgazar mi pom.xml y quizás reducir un poco el tiempo de ejecución.

+1

¿Por qué se utiliza este tipo de cosas dentro de Maven o en POM? – khmarbaise

+4

Para generar información sobre el paquete creado. Es la forma más fácil de "vincular" un paquete binario como un JAR con su estado correspondiente en un repositorio de Git. – Koraktor

Respuesta

6

Creé un plugin de Maven exactamente para este propósito, que realmente se ajusta a mis necesidades (de hecho las excede ahora).

Se llama Mavanagaiata, es de código abierto y está disponible en Maven Central.

10

No uso Maven, así que no sé cómo se llaman estos comandos, pero agregar comandos personalizados a git es bastante trivial.

Crear un script llamado git-TBC que tiene este aspecto:

#!/bin/bash 

git describe --always --tag 
git log -1 --format="%H%n%aD" 
git rev-parse --abbrev-ref HEAD 

Asegúrese de git-TBC está en su PATH, ahora se puede llamar "git por confirmar". Esto es lo que estabas buscando?

+0

Esta es definitivamente una buena manera de resolver mi problema. No pensé en crear un comando personalizado de Git. Pero estaría más interesado en un solo comando integrado de Git. No quiero tener que distribuir comandos personalizados de Git a otros desarrolladores. : X – Koraktor

+1

Comentario justo, podrías incluir el comando en el repositorio de git y dejar que git haga el trabajo por ti, pero de nuevo el desarrollador necesitaría modificar su RUTA. –

+0

Otra cosa que me gustaría evitar. Antes de incluir comandos arbitrarios en scripts bash dentro de mis repositorios, preferiría quedarme con múltiples ejecuciones para esos comandos. Solo una cuestión de preferencia. Gracias sin embargo. – Koraktor

53
  1. git log es extremadamente flexible, con muchas y muchas opciones. Es posible que no pueda reproducir la salida exacta de los tres comandos anteriores, pero puede acercarse lo suficiente para lograr el efecto que necesita.

    Por ejemplo:

    git log --pretty=format:'%ad %h %d' --abbrev-commit --date=short -1 
    

    produce la fecha, SHA-1 y las referencias simbólicas (incluidas las etiquetas) de la última (la cabeza) se comprometen:

    2010-05-20 45bd5e7 (CABEZA , origin/master)

    Después de lo cual, presumiblemente, sed y/o awk o tal vez Maven métodos nativos pueden hacer el ajuste fino/polis Hing. Tenga en cuenta que una etiqueta en particular está asociada con una confirmación concreta, por lo que si fueron tres confirmaciones antes de HEAD con la etiqueta, por ejemplo, "v1.0.0", no verá aparecer "v1.0.0" con la encima.

  2. Un solo comando más simple para proporcionar una descripción sucinta de un compromiso es:

    git describe 
    

    que escribe a cabo la última etiqueta caso, el número de confirmaciones desde los etiquetada cometen, y el SHA1:

    v3.3.0-46-g71a77dc

  3. no estoy familiarizado con Maven, y no tienen idea de lo fácil/diff icult es ejecutar procesos externos, por lo que no estoy seguro de si alguna de las siguientes ayuda de alguna manera, pero pensé que podría mencionarlo por si acaso.

    Para el propósito exacto que describe, es decirtagging se basa, en un marco autoconf/automake, en realidad usar algo como:

    BUILDTAG="`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`" 
    

    que produce algo adecuado para viradas en el extremo de una ruta de programa:

    master-c5282ff

    Una descripción más extensa, adecuada para incluir como comentario o un identificador impreso:

    BUILDDESC="$(git symbolic-ref HEAD 2> /dev/null | cut -b 12-)-$(git log --pretty=format:'%h, %ad' -1)" 
    

    produce algo así como:

    maestro-c5282ff, Fri Mar 12 22:19:51 2010 -0600

Creo que jugar un poco con git log, posiblemente en combinación con herramientas de procesamiento de texto/métodos le dará lo que quiere.

+0

Antes de comenzar a usar algo como 'sed' o' awk' para obtener casi (!) Lo que quiero, lo más probable es que me quede con mis tres comandos separados. Gracias de cualquier manera. – Koraktor

+0

Nota secundaria: # 3 produce la salida 'master-" c5282ff "' – msanford

4

Mi "repo" para cosas así es siempre bash_completion. Ok, "tab tab" es la forma en que bash se convierte en una herramienta productiva, entonces, ¿de dónde vienen todas esas cosas mágicas?

hay un directorio /etc/bash_completion.d/ donde quedan extensiones para completar bash. debe haber un archivo ejecutable git, ábralo y busque algo como get_refs(). Si se le da un cheque usted encontrará que git describir y git para-cada-ref son tus amigos, vamos a probar algunos ejemplos:

un acuerdo de recompra común:

$ cd /your/git/repo; git branch -a 
    master 
    blaster 
* brunch 
    lunch 
    remotes/origin/master 
    remotes/origin/develop 
    remotes/github/master 

que es mi ¿rama marcada?

$ git describe --contains --all HEAD 
brunch 

¿Cuáles son mis controles remotos?

$ git remote 
origin 
github 

¿Cuáles son las sucursales en los controles remotos?

$ git for-each-ref --format="%(refname:short)" refs/remotes 
origin/master 
origin/develop 
github/master 

¿Cuáles son mis sucursales locales?

$ git branch 
    master 
    blaster 
* brunch 
    lunch 

... a más ramificaciones parseables de salida?

$ git for-each-ref --format="%(refname:short)" refs/heads 
master 
blaster 
brunch 
lunch 

¿Qué pasa con las etiquetas?

verificación
$ git for-each-ref --format="%(refname:short)" refs/heads refs/remotes refs/tags 
master 
blaster 
brunch 
lunch 
origin/master 
origin/develop 
github/master 
release-0_1 
release-0_2 
release-1_0 

los "hombre páginas" de estos comandos, hay mucho más en el interior !.

+0

No tengo idea de por qué se votó al alza; no responde en absoluto a la pregunta (muy claramente formulada): a saber, obtener la "etiqueta actual, la rama, la fecha y SHA1 de la confirmación más reciente". Útil o no, no responde la pregunta. – michael

+0

Su propia respuesta parece ser lo suficientemente válida, ¿por qué molestarse con otro script de bash ?. Mucha gente podría llegar a esta pregunta para obtener cualquier tipo de referencia sobre su propio repositorio. Supongo que esa es la razón por la que lo voté. mi respuesta fue cargada más de un año después de la pregunta, con muchas buenas respuestas. – albfan

+0

Pero, su respuesta también requeriría un script bash para pegar las varias piezas, ¿no? Claro, has publicado algunos fragmentos interesantes de git-fu (además, la punta de la recolección de bash-completion también es una buena idea.) Pero el único problema es que llegamos a esta pregunta buscando específicamente la etiqueta "commit" más reciente. + branch + date + SHA1 "(es decir, la respuesta a la pregunta). No solo "rama" o "etiqueta" (eso es todo lo que has mostrado): cada uno individualmente fácilmente en Google; pero el combo (en un comando) no lo es. Pero tenemos que leer "cosas que puedan encontrar interesantes" solo para descubrirlo. – michael

3

He encontrado que esto Maven Plugin: https://github.com/alx3apps/jgit-buildnumber, que parece un buen reemplazo de BuildNumber-maven-plugin de para proyectos git. Además, está disponible en Maven Central Repositories.

Funciona muy bien en Maven 3. Para Maven 2 proyectos de varios módulos, sólo tiene que añadir la siguiente línea en la sección de propiedades de su pom padres:

<session.executionRootDirectory>${basedir}</session.executionRootDirectory> 
1

Esto muestra el ID de comprometerse de la cabeza, así como las ramas o las etiquetas que también resultan ser exactamente en HEAD.

git reflog --decorate -1 

Salida de ejemplo:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) [email protected]{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD 
Cuestiones relacionadas