Поиск слияния происходит из тега через ветки в git

Мой продукт - плагин для IntelliJ. Я поддерживаю несколько версий базовой платформы IntelliJ и выпускаю сборки моего плагина для каждого из них, так как их API часто меняются между версиями. Я просто работаю над этим, поэтому я развиваюсь в мастер, а затем поддерживаю ветку для каждой из других версий. Поэтому мое репо выглядит следующим образом:

   1.6.0  1.6.1-eap1
.... a---b---c--- master
      \       \
       d-------e--- idea-2017.1
        \       \
         f-------g--- idea-2016.3
          \       \
          ...     ...  etc etc

a является стабильным выпуском и помечен 1.6.0. c является выпуском EAP (бета) и отмечен 1.6.1-eap1. Эта схема отлично подходит для этих двух случаев.

Иногда я хотел бы создать сборку dev, которая не входит в канал выпуска, но пользователи могут загружать ее вручную и тестировать, если захотят. Я хотел бы создать сборку dev для каждой платформы, так как пользователи-разработчики могут использовать любую версию IntelliJ. Лучший способ, я могу думать, - создать ветку для dev, например, тег 1.6.0 (commit a), а затем соответствующие ветки от commits d, f и т.д., На которых я может объединить ветвь dev и создать из нее сборки dev.

Предполагая, что я хочу написать script для создания и поддержки этих ветвей, как я могу найти коммит d, f и т.д. из тега 1.6.0, чтобы создать ветки dev dev из <? p >

Ответ 1

Для проблемы "найдите между a ang g самое раннее коммит из idea-2016.3, которое не было в idea-2017, а самое раннее в idea-2017, которое не было в master" решение было бы использовать команда:

git log --oneline --source --ancestry-path  master idea-2017 idea-2016.3 --not 1.6.0

вывод в истории аналогичен вашему:

cf32d9f idea-2017 e
88f264c idea-2016.3 g
5bc9fa1 idea-2017 d
3f460fe idea-2016.3 f
224cac8 master c
67620cd master b

Затем найдите последнюю строку, отмеченную idea-2016.3 и последнюю, помеченную idea-2017, это будет ваша фиксация.

Обратите внимание, что выход может быть нежелательным, если возникла проблема с блокировщиком из-за различий в версии, например, в f, которая была исправлена ​​в следующем f'. Поэтому я бы все же рассмотрел явные тегирования.

Ответ 2

Вот что я в итоге сделал:

#!/bin/sh

set -e  # Automatically abort if any simple command fails

die () {
    echo >&2 "[email protected]"
    exit 1
}

[ "$#" -eq 2 ] || die "Usage: $0 <branch name> <tag>"

tag_commit=$(git rev-list --abbrev-commit -n 1 $2)
[ "${tag_commit}" = "" ] && die "No commit found for $2"

child_commit() {
  git log --graph --pretty=format:"%h %p" --decorate -20  --first-parent $1 | grep $2 | cut -c 3-10
}

branch_2017_1=$(child_commit idea-2017.1 $tag_commit)
[ "${branch_2017_1}" = "" ] && die "No commit found for idea-2017.1"

branch_2016_3=$(child_commit idea-2016.3 $branch_2017_1)
[ "${branch_2016_3}" = "" ] && die "No commit found for idea-2016.3"

branch_2016_2=$(child_commit idea-2016.2 $branch_2016_3)
[ "${branch_2016_2}" = "" ] && die "No commit found for idea-2016.2"

branch_2016_1=$(child_commit idea-2016.1 $branch_2016_2)
[ "${branch_2016_1}" = "" ] && die "No commit found for idea-2016.1"

git branch "$1" $tag_commit
git branch "$1-2017.1" $branch_2017_1
git branch "$1-2016.3" $branch_2016_3
git branch "$1-2016.2" $branch_2016_2
git branch "$1-2016.1" $branch_2016_1

Теперь я просто обновляю сценарии подготовки к слиянию и выпуске, чтобы, при желании, принять название серии ветвей, и я думаю, что буду хорошо.

Секретный соус находится в функции child_commit, которая вырезана из здесь.

Ответ 3

Наверное, самым простым способом является поддержка списка поддерживаемых имен версий/ветвей в оболочке script?

Я думаю об этом, если вы добавите другое изменение:

1.6.0      eap1 eap2
.... a---b---c---h--- master
      \       \   \
       d-------e---i--- idea-2017.1
        \       \   \
         f-------g---j--- idea-2016.3
          \       \   \
          ...     ...  etc etc

Вы хотите, чтобы это изменение (h) было объединено с головкой ветвей, показанной на вашей диаграмме, т.е. h объединяется в e и g. В ветке 2017.1 указывалось бы на e, которое является правильной фиксацией для слияния.

Вы могли бы что-то сделать, возвращаясь назад, чтобы найти общего предка или что-то еще, но я думаю, что это бесполезно сложно и на самом деле ничего не покупает.

Плюс, если вы просто сохраняете список веток, вы можете легко поддерживать старые версии.