Hmm, este uso de un nombre de rama parece a pescado. Como en la respuesta de Dustin, puede haber múltiples ramas que contengan un compromiso. ¿Por qué uno de esos nombres de rama es mejor que otro para este propósito?
Si solo le importa una rama específica, puede calcular la "base de combinación" entre la bifurcación y la confirmación.
En los siguientes diagramas, la confirmación de compilación es C
, la punta de la rama reclamada es T
, y la base de combinación está etiquetada con M
encima.
Si M
igual a igual C
T
, a continuación, el de la confirmación de construir es la punta de la rama se reivindica.
M
↓
o--o--o--o--o--x branch # x is both C and T
Si M
es igual a C
, a continuación, la punta de la rama reivindicada es un descendiente del comprometan a construir.
M
↓
o--o--C--o--o--T branch
Si M
es igual a T
, entonces el comprometen a construir es un descendiente de la punta de la rama se reivindica.
M
↓
o--o--T branch
\
o--o--C
Si M
es igual a otra cosa, entonces C
es un descendiente de un antepasado de T
.
M
↓
o--o--o--o--o--T branch
\
o--o--C
Si no hay M
, entonces el comprometen a construir no se relaciona con la rama reivindica.
o--o--o--o--o--T branch
o--o--o--o--C
usted puede hacer esta verificación como esto:
#!/bin/sh
# Usage: is-ancestor-of <branch> <commit>
if test $# -ne 2; then
echo "$0"': invalid arguments'
exit 128
fi
claimed_branch="$1"
commit="$2"
merge_base="$(git merge-base "$commit" "$claimed_branch")" &&
test -n "$merge_base" &&
test "$merge_base" = "$(git rev-parse --verify "$commit")" &&
exit 0
echo "$commit is not an ancestor of $claimed_branch" 1>&2
exit 1
El script anterior en realidad no requieren o comprobar que el argumento 'rama' es una rama (que podría ser cualquier compromiso ish). Para comprobar que algo es en realidad una rama, se usa algo como esto:
#!/bin/sh
# Usage: is-branch <branch>
if test $# -ne 1; then
echo "$0"': invalid arguments'
exit 128
fi
branch="$1"
# check various branch hierarchies, adjust as needed
git show-ref --verify refs/heads/"$branch" ||
git show-ref --verify refs/remotes/"$branch" || {
echo "not a branch name: $branch" 1>&2
exit 1
}
por lo que podría usarlas juntas para comprobar que algo es una rama y que un cierto revisiones existentes en esa rama:
is-branch "$claimed_branch" && is-ancestor-of "$claimed_branch" "$commit_to_build"
¿Por qué necesita el nombre de la sucursal? parece una información extra inútil para el sistema de compilación. Y realmente no veo cómo sería útil para un desarrollador leer los registros de compilación. – hasen
podría necesitar el nombre de la sucursal en caso de que su flujo de trabajo ha, no sé, una rama desarrollar y maestro utilizado para el despliegue y desea saber si comete metido en ninguna en particular? Por cierto, acepte la respuesta real. –
@Pinko creo que la respuesta seleccionada debe ser [éste] (https://stackoverflow.com/a/2444924/161278). Dado que tiene muchos más votos y es mucho más simple debido al uso de la funcionalidad nativa de git. –