2010-08-05 11 views
7

Quería hacer esta pregunta para ver si lo estoy haciendo bien. La siguiente secuencia de comandos funciona a excepción de la comprobación para ver si el commit ha sido empujado a un acuerdo de recompra a distancia que no puedo encontrar el comando adecuado para:función Bash/Shell Script para verificar que la etiqueta Git o Commit existe y se ha enviado al repositorio remoto

#!/bin/bash 
set -e # fail on first error  
verify_git_ref() { 
     log "Verifying git tag or commit: \"$1\" ...." 
     if git show-ref --tags --quiet --verify -- "refs/tags/$1" 
     then 
      log_success "Git tag \"$1\" verified...." 
      GIT_TAG_OR_REF=$1 
      return 0 
     elif git rev-list $1>/dev/null 2>&1 
     then 
      log_success "Git commit \"$1\" verified...." 
      GIT_TAG_OR_REF=$1 
      return 0 
     else 
      log_error "\"$1\" is not a valid tag or commit, you must use a valid tag or commit in order for this script to continue" 
      return 1 
     fi 
    } 

relacionados: List Git commits not pushed to the origin yet

Respuesta

7

Comprobación de si una El control remoto tiene una etiqueta dada es bastante simple: solo debe analizar la salida de git ls-remote --tags para ver si contiene su etiqueta.

Comprobar si una confirmación determinada existe es un poco complicado. Todo está basado en ref. ¿Sabes de qué ref debería ser accesible? Si lo haces, probablemente deberías buscar esa referencia y verificar localmente si la confirmación es un antecedente de ella. Es decir, obtener el maestro de origen y ver si el compromiso está en origen/maestro.

También puede intentar usar git push -n para ejecutar el commit en esa rama, y ​​ver qué sucede, si es una operación no operativa, la confirmación ya está en la rama.

Si no sabe en qué rama debe estar ... probablemente solo tenga que buscarlos y revisarlos.

3

Tengo esto en funcionamiento, ¿qué opinas?

verify_git_ref() { 
    log "Verifying git tag or commit: \"$1\" ...." 
    if git branch -r --contains $(git rev-parse $1) | grep origin>/dev/null 2>&1 
    then 
     log_success "Git tag or commit \"$1\" verified...." 
     GIT_TAG_OR_REF=$1 
     return 0 
    else 
     log_error "\"$1\" is not a valid tag or commit that has been pushed, you must use a valid tag or commit in order for this script to continue" 
     return 1 
    fi 
} 
+1

El problema con esto es que en realidad no inspeccionar el mando a distancia - sólo inspecciona lo que sabe de los (las ramas remotas, que se almacenan localmente) remotos. Esto funcionará en la mayoría de los casos, ya que si presiona hacia el control remoto, sus sucursales remotas se actualizarán. Pero si el control remoto se aleja de ti, no tendrás suerte, a menos que vengas primero. (Tampoco necesitas el git rev-parse, no creo.) – Cascabel

+0

Hago un jalón antes de ejecutar este comando, pero tienes razón y creo que tu respuesta está más en línea con una respuesta genérica a la pregunta que hice y marcaré la tuya como la respuesta real. – Freddie

Cuestiones relacionadas