Git: есть ли более быстрый способ слияния из одной ветви в несколько ветвей, чем делать каждую последовательно? - PullRequest
11 голосов
/ 22 февраля 2010

Моя ситуация:

Я недавно присоединился к внешней стороне установленного проекта, который включает в себя растущее число экземпляров приложения rails, каждый из которых отличается по некоторым аспектам (представления, стили, настройки и т. Д.), Но которые все разделяют большинство их внутреннего кода.

В нашем репозитории Git есть несколько веток, которые выглядят примерно так:

master
apple
banana
cherry
...
strawberry
tangerine
...

Где каждая производная ветвь содержит производственный код для производственного экземпляра.

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

Моя проблема:

Работа, специфичная для отдельного экземпляра, достаточно проста, происходит в ветке (или в ветке разработчика) и т. Д. И т. Д. *

Однако, если мне нужно внести изменение, которое затронет все сайты в кластере, я делаю это в данный момент в ветке dev и объединяю его с master, а затем (что меня беспокоит) приходится вручную проверять каждую продукцию ответвляйтесь по очереди и объединяйте мастера в него.

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

В настоящее время у нас есть что-то вроде 8 производственных филиалов, так что это не так уж и плохо, но план нацелен на рост, и к тому времени, когда он достигнет даже 20 (не говоря уже о 50+), это станет серьезной болью. Это также будет моей личной болью, так как я - тот, кто, вероятно, будет иметь дело с этим на повседневной основе.

Итак, мои настоящие вопросы:

  • Есть ли что-то в основной функциональности git, которое мне не хватает, что позволило бы мне элегантно слиться с мастером в n других веток одним махом? (думаю, вряд ли, но все же стоит спросить)
  • В качестве альтернативы, может быть, есть способ сделать это с помощью хитроумных сценариев оболочки? (из которых я мог бы добавить, я знаю очень мало, а понимаю еще меньше)

Если последний из них может помочь мне начать / направить меня в правильном направлении?

Заранее большое спасибо за ваше время и помощь.

1 Ответ

8 голосов
/ 22 февраля 2010

Прежде чем ответить на этот вопрос, я хочу прояснить, что это хорошая идея только в тех случаях, когда это происходит, когда объединяющиеся ветви являются производственными, а не ветвями разработки. Если вы нашли этот пост, в котором ищется способ объединения веток интеграции (основной) во все ветки вашей темы (разработки), ответ таков: вы почти наверняка не должны ( см. Здесь ).

Хорошо, и настоящий ответ. Нет встроенного способа, потому что (при условии, что это не ускоренная перемотка вперед) вам действительно нужно проверить файлы на git, чтобы выполнить магию слияния. К счастью, вы на самом деле не делаете много (git checkout && git merge), поэтому написать скрипт не составит труда. Вы можете усложнить это с помощью файла конфигурации или даже добавить некоторые пользовательские вещи в .git/config (например, git config branch.<branchname>.productionbranch true, а затем использовать команды git, чтобы проверить, в каких ветвях установлен этот флаг), но самый простой способ будет выглядеть примерно так:

#!/bin/bash

production_branches=( branch1 branch2 branch3 )

for branch in ${production_branches[@]}; do
    if ! ( git checkout $branch && git merge master ); then
        exit
        # Exit on the first error
        # If you want to just plow ahead, do something like this:
        # git reset --hard       # make sure there aren't merge conflicts in the tree
        # failed_merges="$failed_merges $branch"  # remember for later
    fi
done

# if you plowed ahead above, print the branches which failed to checkout+merge
# if [ -n "$failed_merges" ]; then
#     echo "Failed merges: $failed_merges"
# fi

Как всегда, вы можете сделать много улучшений. Например, вы можете использовать некоторые команды git, чтобы проверить, был ли мастер уже объединен с данной веткой, и избежать проверки. Если вы переходите к прошлым неудачным слияниям, вы можете выполнить извлечение и слияние по отдельности в случае, если это была неудачная проверка (это может означать грязное рабочее дерево, что означает, что все они потерпят неудачу). Надеюсь, этого достаточно, чтобы вы начали!

...