Как определить, есть ли в ветви интеграции функциональная ветка - PullRequest
1 голос
/ 08 мая 2020

Я делаю страшную работу по удалению локальных веток. Я беру последнюю из нашей ветки интеграции:

git fetch origin dev

, а затем хочу локально сравнить origin / dev с функциональными ветками. Но я не хочу проверять origin / dev. Я считаю, что цель - обеспечить, чтобы журнал git для origin / dev содержал подсказку (последнюю фиксацию) каждой функциональной ветки.

Следующая команда не очень эффективна в моем случае:

git branch --contains <commit-id>
  1. неясно, как использовать ветку, отличную от текущей.
  2. У меня нет идентификатора фиксации ветки сравнения, но у меня есть имя ветки.

Итак, я ищу альтернативную команду:

git branch origin/dev --contains-branch <some-feature-branch>

есть ли команда, которая может это сделать?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Чтобы перечислить подсказки веток, которые доступны из origin/dev, вы можете использовать

git branch --merged origin/dev

Обратите внимание, что это список origin/dev, если это локальная ветка (которая, как я полагаю, отсутствует в вашем case).

Если вы хотите написать сценарий около git branch, имейте в виду, что это "фарфоровая" команда, т. е. ее выходной формат не каменный и может измениться в будущей версии Git.

0 голосов
/ 08 мая 2020

Что делает git branch --contains:

  1. Разрешает HEAD коммит ha sh. Если вы находитесь в ветке br, это разрешает name br в фиксацию ha sh. (Пусть некоторая переменная h представляет это ha sh.)
  2. Для всех имен веток:

    • Разрешить имя для фиксации 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-refgit rev-parse, если на то пошло).

...