Что делает git branch --contains
:
- Разрешает
HEAD
коммит ha sh. Если вы находитесь в ветке br
, это разрешает name br
в фиксацию ha sh. (Пусть некоторая переменная h представляет это ha sh.) Для всех имен веток:
- Разрешить имя для фиксации ha sh. Назовем это b для ветки ha sh.
- Тест-предок: is b предок h ?
- Если b является предком h , выведите имя этой ветки.
Команда завершена: в ней перечислены имена ветвей, фиксация которых содержится в этой ветке.
Ваша проблема очень похожа, но проще. Вы хотите разрешить имя origin/dev
какому-то ha sh h . Затем для некоторого подмножества имен ваших веток - имен функций, которые вам интересны - вы хотите:
- преобразовать имя в ha sh ID b .
- Проверка предка: является ли b предком h ? (Другими словами: s фиксация подсказки этой ветки содержится в
origin/dev
, будучи предком фиксации подсказки origin/dev
?) - Если да, выведите имя.
Есть команда, реализующая этот тест «is-ancestor», но это немного удивительно: это git merge-base
. Команда:
git merge-base $b $h
сообщает об успехе (выходит из нуля), если $ b является предком $ h, и сообщает об ошибке (выходит из нуля), если нет. Тест «является предком», который он реализует, совпадает с тестом, который использует git branch --contains
, поэтому он дает прямой ответ, который вы хотите.
Остающаяся проблема - найти нужные имена веток. Команда git for-each-ref
буквально предназначена для этого.
Следовательно:
hname=origin/dev
h=$(git rev-parse $hname) || die "cannot get commit hash ID for $hname"
git for-each-ref --format='%(refname:short) %(objectname)' refs/heads/feature |
while read name b; do
if git merge-base --is-ancestor $h $b; then
echo $name is contained within $hname
fi
done
(примечание: непроверено). refs/heads/feature
здесь представляет ветки с именем feature/*
; если у вас есть другой шаблон, который вам нужно сопоставить, используйте этот другой шаблон или используйте сам refs/heads
и вставьте что-нибудь в l oop, чтобы пропустить "неинтересные" имена веток или что-то еще.
См. Документацию для git merge-base
и git for-each-ref
(и git rev-parse
, если на то пошло).