我的情况:
我最近加入了一个已建立项目的前端,该项目涉及越来越多的rails应用程序实例,每个实例在某些方面(视图,样式,设置等)都不同但都共享他们的大部分后端代码。
我们的Git repo有许多分支看起来像这样:
master
apple
banana
cherry
...
strawberry
tangerine
...
每个水果派生分支都包含生产实例的生产代码。
(Master不用于实时部署,但包含所有共享代码,是我们从中设置新实例的克隆。)
我的问题:
特定于单个实例的工作很简单,发生在分支(或其开发分支)等等...
但是,如果我需要进行一个会影响集群中所有站点的更改,我现在在dev分支中执行此操作并将其合并到master中,然后(什么在烦我)必须手动检查每个生产依次分支并将master合并到其中。
即使我的谦逊代码猴脑也能看出这种情况不能很好地扩展。
目前我们有8个生产分支,所以它并没有那么糟糕,但计划是为了增长,到达20甚至20(更不用说50+)的时候,这将是一个严重的痛苦。这也将是我个人的痛苦,因为我是那个可能每天都在处理它的人。
所以,我的实际问题是:
如果后者可以帮助我开始/指出正确的方向吗?
非常感谢您的时间和帮助。
答案 0 :(得分:8)
在我回答这个问题之前,我想非常清楚,在这种情况下,这只是一个好主意,其中要合并的分支是生产分支,而不是开发分支。如果你发现这篇文章正在寻找一种方法将集成分支(master)合并到你所有的主题(开发)分支中,答案是你几乎肯定不应该(see here)。
好的,真正的答案。没有内置的方式,因为(假设它不是一个快进的)你真的必须检查文件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命令来检查master是否已合并到给定分支中,并避免将其检出。如果您正在继续过去失败的合并,您可以单独进行结帐并合并,以防结帐失败(这可能意味着工作树很脏,这意味着它们都会失败)。希望这足以让你开始!