2010-11-08 11 views
13

Cómo validar si la cometen con sha dada existe en rama actual?Validar si existe cometer

Hay muchas maneras de analizar los resultados, pero necesito manera óptima que devuelve booleano (para el uso en la escritura del golpe).

p. Ej.

sha=$1 
if [ -z `git magic --validate $sha` ]; then 
    echo "Invalid commit sha: $sha" 
    exit 1 
fi 
+0

posible duplicado de [¿Cómo puedo saber si se cometen es un antepasado de otro comprometerse (o viceversa)?] (Http://stackoverflow.com/questions/ 18345157/how-can-i-tell-if-one-commit-is-an-ancestor-of-another-commit-or-vice-versa) – tavnab

Respuesta

5

Los rev-list | grep funciona el método multa; hay el poco más pequeño de los gastos generales porque Git tiene que imprimir todos los SHA1s para grep para ver, pero no es realmente un gran problema.

También puede hacerlo con git merge-base si se quiere - si la base de mezcla del objetivo cometió y la rama es el objetivo de cometer, la rama contiene el destino se comprometen:

if [ "$(git merge-base $commit $branch)" = "$commit" ]; then 
    ... 
fi 

De cualquier manera que lo hace , tenga en cuenta que rev-list y merge-base se van a imprimir SHA1s, por lo que si el commit que está probando para su inclusión es nombrado por una rama o una etiqueta, usted querrá utilizar git rev-parse para convertirlo en una primera SHA1.

+0

Una pequeña nota: el operador de cadena POSIX igualmente es '=', no '=='. bash aceptará ambos de todos modos. –

+0

@Sven: Gracias, siempre me olvido de eso. – Cascabel

+1

Para una optimización pequeña, es útil usar 'git rev-list -qn1 2>/dev/null', que no atravesará todo el árbol de compromisos y saldrá con un código de salida distinto de cero si el compromiso dado lo hace no existe. – nvie

1
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in 

Puede utilizar el código de salida de grep en los condicionales.

Para la rama actual,

git rev-list HEAD | grep -q sha-youre-interested-in 
4

Usted puede mirar en la salida del

git rev-list HEAD..$sha 

Si este comando falla porque el sha1 no existe en absoluto en el repositorio, el código de salida se ser diferente de cero. Si la salida está vacía, la confirmación se encuentra en la rama actual, y si no está vacía, no lo está. Por lo que su guión se vería

if revlist=`git rev-list HEAD..$sha 2>/dev/null` && [ -z "$revlist" ]; then 
    : 
fi 

En caso de que usted ya sabe que $sha realmente nombres de una confirmación (como un hash SHA1 o de cualquier otra manera), esto simplifica a

if [ -z "`git rev-list HEAD..$sha`" ]; then 
    : 
fi 
17
git rev-parse --quiet --verify <commit> 

en realidad no verificar que comprometen (supongo SHA1 es lo que se entiende) existe. Verifica que haya un objeto en la base de datos correspondiente al SHA1 provisto. Es decir, si hay un blob o un objeto de árbol que coincida con el SHA1, informará que existe, incluso si no es una confirmación.

git rev-parse --quiet --verify <sha1>^{commit} 

Esto verifique que el objeto existe y que es un objeto que puede ser utilizado como una confirmación (confirmación o etiqueta anotada).

+0

Pero esto no limita los hallazgos a la sucursal actual según lo solicitado por el OP. – sschuberth

1

git impresiones gato-archivo de información acerca de los objetos en el repositorio. cheques "-e" si el objeto es válido y salidas con un estado 0 y cuando no válida existe con un 1.

git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5 
echo $? 
1 
2
git merge-base --is-ancestor $sha HEAD 

Este pruebas si $sha es un antepasado de confirmación para la rama actual (HEAD), y sale con éxito si es así.

En su ejemplo,

sha=$1 
if ! git merge-base --is-ancestor $sha HEAD; then 
    echo "Invalid commit sha: $sha" 
    exit 1 
fi 
+0

Esta opción está disponible desde Git 1.9.0. – Palec

+0

Correcto. v1.9 ha existido por alrededor de un año y medio al momento de escribir esto. –

+0

Debian tiene un ciclo de lanzamiento de 2 años, y AFAIK no es raro que la versión antigua esté en uso de producción. Es por eso que creo que es necesario indicar la versión de Git en la que se incluyó esta función. – Palec