Как определить, к какой ветви был добавлен тег с фиксацией - PullRequest
0 голосов
/ 14 марта 2019

Как часть процесса ci, который запускается тегами git, мне нужно автоматически обновить что-то в коде, используя это имя тега, а затем зафиксировать результат обратно в git.

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

Я могу зафиксировать по умолчанию в master, и это обычно будет работать, но будут крайние случаи, в которых я не могу предсказать поведение для.

Более разумное решение состоит в том, чтобы каким-то образом (если возможно) выяснить, в какую ветку был добавлен тег с фиксацией, так что я вернусь к этой ветви.

Возможно ли это?

(также, если вы видите какие-либо проблемы с этим подходом и / или хотите предложить что-то лучшее, пожалуйста, поделитесь своими мыслями)

1 Ответ

0 голосов
/ 14 марта 2019

Вы можете получить список ветвей, из которых доступен тег

git for-each-ref --contains my_tag refs/heads

(Вы можете использовать git branch вместо git for-each-ref, но for-each-ref обычно лучше подходит для использования в скрипте. Возможно, вам придется добавить опцию --format, чтобы вывод выглядел так, как вы хотите. )

Это может вернуть несколько ветвей, и вам придется решить, как это согласовать. Одной из стратегий было бы выяснить, достижима ли одна из ветвей от другой. Например, если у вас есть

x -- x -- A <-[my_tag]
            \
         ... M -- x <--(b1)
                   \
                ... M <--(b2)

у нас есть b1 достижимый с b2 и помеченный коммит, достижимый обоими. Вы могли бы интуитивно предпочесть сказать, что A был объединен с b1, если «какая команда слияния, я думаю, была выполнена», является важной вещью. Или, если он работает лучше для фиксации рядом с новейшей разработкой, возможно, вы бы выбрали b2 в этом случае В любом случае, вы также можете столкнуться с таким случаем, как

x -- x -- A <-[my_tag]
            \
             \        x <--(b1)
              \      /
           ... M -- x
                     \
                      x <--(b2)

, где совершенно произвольно говорить, что A был объединен "в b1" против "в b2" (против "в какую-то другую ветку, которая больше не существует"). Так что на данный момент вам, возможно, придется просто выбрать один.

Таким образом, вообще говоря, вы не можете однозначно идентифицировать одну ветку, в которую был добавлен отмеченный коммит. Возможно, он был объединен с удаленной веткой или даже может быть объединен в отключенном состоянии HEAD.

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

...