2010-02-22 126 views
11

我的情况:Git:从一个分支到多个分支合并比每个分支合并更快吗?

我最近加入了一个既定的项目涉及越来越多的一个Rails应用程序的情况下,每一个在某些方面有所不同的(观点,造型的前端侧,设置等),但它们都共享其大部分后端代码。

我们的Git回购有很多分支的看起来是这样的:

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

其中每个水果衍生分支是适用于生产实例的产品代码。

(主不用于现场部署,但包含了所有的共享代码,这也是我们会从建立一个新的实例克隆。)

我的问题:

工作具体到一个单一的实例很简单,发生在分支机构(或其开发分支)等等...

但是,如果我需要进行更改,将影响群集中的所有网站我现在在开发分支中做到这一点,并将它合并到主人手中,然后(有什么搞砸我)必须手动y依次检查每个生产分支并将主体合并到其中。

即使我的卑微的代码猴子大脑可以看到,这不能很好地扩展。

目前我们有8个生产分支,所以没有那么糟糕,但是计划是为了增长,到20岁时(更不用说50+),这将是一个严重的痛苦。这也是我个人的痛苦,因为我可能每天都在处理这件事。

所以,我的实际问题是:

  • 有什么在我的思念,让我从优雅的主合并成ň其他部门一举核心git的功能? (不太可能我认为,但值得提问)
  • 或者,可能有办法做到这一点狡猾一些shell脚本? (我可以补充一点,我知道的很少,甚至更少理解)

如果后者能帮助我开始/指向正确的方向吗?

非常感谢您的时间和帮助。

回答

8

在我回答这个问题之前,我想说清楚的是,在这种情况下,这只是一个好主意,合并的分支是生产分支,而不是开发分支。如果您发现这篇文章寻找将整合分支(主人)合并到所有主题(开发)分支的方法,答案是您几乎肯定不应该(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是否已经被合并到一个给定的分支中,并避免检查它。如果你正在移动过去失败的合并,你可以做结账和合并,以防万一结账失败(这可能意味着肮脏的工作树,这意味着它们都会失败)。希望这足以让你开始!

+0

嘿Jefromi,感谢您的非常清楚和有用的答案 - 时间让我弄脏我的手我认为... – 2010-02-22 18:17:56

+0

+1为您链接到的伟大的文章! – 2011-03-16 17:40:48