Ответ 1
Хм, это использование названия ветки кажется подозрительным. Как и в ответе Дастина, может быть несколько ветвей, которые содержат фиксацию. Почему для этой цели какое-либо из этих названий веток лучше другого?
Если вам нужна только одна конкретная ветвь, вы можете вычислить "базу слияния" между веткой и фиксацией.
На следующих диаграммах фиксация для сборки 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
Вышеупомянутый script фактически не требует или не проверяет, что аргумент ветвления является ветвью (это может быть любое commit-ish). Чтобы проверить, что что-то действительно является веткой, вы можете использовать что-то вроде этого:
#!/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"