Hmm, questo uso di un nome del ramo sembra pesce. Come nella risposta di Dustin, potrebbero esserci più rami che contengono un commit. Perché uno di questi nomi di rami è migliore di un altro per questo scopo?
Se si interessa solo di un ramo specifico, è possibile calcolare la "base di unione" tra il ramo e il commit.
Negli schemi che seguono, il commit costruire è C
, la punta del ramo dichiarato è T
, e la base di unione è apposta la M
sopra di esso.
Se M
uguale C
uguale T
, poi la la impegnarsi a costruire è la punta del ramo rivendicato.
M
↓
o--o--o--o--o--x branch # x is both C and T
Se M
uguale C
, poi la punta del ramo dichiarato è un discendente del impegnarsi a costruire.
M
↓
o--o--C--o--o--T branch
Se M
uguale T
, quindi il commit di costruire è un discendente della punta del ramo rivendicato.
M
↓
o--o--T branch
\
o--o--C
Se M
uguale a qualcosa d'altro, poi C
è un discendente di qualche antenato di T
.
M
↓
o--o--o--o--o--T branch
\
o--o--C
Se non c'è M
, quindi il commit di costruire non è correlato al ramo rivendicato.
o--o--o--o--o--T branch
o--o--o--o--C
È possibile effettuare questo controllo in questo modo:
#!/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
Lo script precedente in realtà non richiedono, o verificare che l'argomento 'ramo' è un ramo (potrebbe essere qualsiasi Commitee ish). Per controllare che qualcosa è in realtà un ramo, si potrebbe usare qualcosa di simile:
#!/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
}
Così li si potrebbe usare insieme per verificare che qualcosa è un ramo e che un certo commit è in quel ramo:
is-branch "$claimed_branch" && is-ancestor-of "$claimed_branch" "$commit_to_build"
fonte
2010-03-15 05:38:17
perché hai bisogno del nome del ramo? sembra un'informazione inutile al sistema di compilazione. E non vedo davvero come sarebbe utile a uno sviluppatore che legge i log di costruzione. – hasen
Avresti bisogno del nome del ramo nel caso in cui il tuo flusso di lavoro abbia, non so, un ramo di sviluppo e master utilizzato per la distribuzione e vuoi sapere se i commit sono entrati in un particolare? A proposito, per favore accetta la vera risposta. –
@Pinko Penso che la risposta selezionata dovrebbe essere [questa] (https://stackoverflow.com/a/2444924/161278). Dal momento che ha molti più voti e molto più semplice grazie all'uso della funzionalità git nativa. –