Хм, это использование названия ветви кажется подозрительным. Как и в ответе Дастина, может быть несколько веток, содержащих коммит. Почему одно из этих названий веток лучше, чем другое для этой цели?
Если вам нужна только одна конкретная ветка, вы можете вычислить «базу слияния» между веткой и коммитом.
На следующих рисунках коммит для сборки равен C
, кончик заявленной ветви - T
, а основание объединения помечено M
над ним.
Если M
равно C
равно T
, то коммит для сборки является верхушкой заявленной ветви.
M
↓
o--o--o--o--o--x branch # x is both C and T
Если M
равно C
, то верхушка заявленной ветви является потомком коммита для сборки.
M
↓
o--o--C--o--o--T branch
Если M
равно T
, то обязательство по созданию является потомком вершины заявленной ветви.
M
↓
o--o--T branch
\
o--o--C
Если M
равно чему-то другому, то C
является потомком какого-то предка T
.
M
↓
o--o--o--o--o--T branch
\
o--o--C
Если нет M
, то фиксация для сборки не связана с заявленной веткой.
o--o--o--o--o--T branch
o--o--o--o--C
Вы можете сделать эту проверку следующим образом:
#!/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
Приведенный выше скрипт на самом деле не требует и не проверяет, является ли аргумент «ветвь» ветвью (это может быть любой коммит). Чтобы проверить, что что-то действительно является веткой, вы можете использовать что-то вроде этого:
#!/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
}
Таким образом, вы можете использовать их вместе, чтобы убедиться, что что-то является ветвью и что в этой ветке находится определенный коммит:
is-branch "$claimed_branch" && is-ancestor-of "$claimed_branch" "$commit_to_build"