如何在Git中实现部署分支

时间:2009-01-28 14:13:38

标签: git deployment branch

我正在使用git进行PHP项目,我认为它非常方便。如果我让它发挥作用,有一件事情会很棒。

我创建了一个分支,用于部署。它有一些差异,比如不同的配置文件和文档。

我不能忽视它们,因为它们将留在两个分支中,而我想在两个分支中保持不同。

问题在于,当我合并分支时,那些意图不同的文件也会被合并。

有没有方便的方法来完成这样的事情?这通常是怎么做的?

11 个答案:

答案 0 :(得分:11)

我不确定Git是否会以这种方式使用。

首先是快速Linus advice,总是“丰富多彩”且信息丰富;)

  

Git 非常从根本上跟踪项目状态,而不是文件状态。这意味着你非常不能尝试“合并文件”。在git中这是一个毫无意义的操作,事实上,任何允许它的SCM都注定要成为sh t()的一部分。

     

(*)我不是说那只是因为git不这样做。它比那更基础。一旦你开始进行每个文件的分支和合并,你基本上搞砸了自己,你将永远无法再将这个项目作为一个“整个项目” - 你不再拥有一个定义明确的历史记录是整个项目的历史。


那说,你可以:

  • 管理这些配置/ doc文件一个单独的git子项目(注意:use of submodules has been discussed here
  • 或记录部分合并(对我们不想合并的文件使用“我们的”策略),然后 - 命名它。

此线程中的其他解决方案涉及在部署服务器上使用“特定于服务器”的分支

Development        Deployment

#origin/master:
x--x               $ git clone

                   # master
                   x--x

                   $ git checkout -b deployment origin/master

                   x--x
                       \ 
                        -- #deployment

                   $ .... #makes changes for config files
                          #or other specific deployment files

                   x--x
                       \
                        --d1--d2 # no need to push that branch ever.

#new developments
x--x--x--x

                   $ git pull --rebase #pull origin/master and 
                                       #replay current branch on top of it
                   x--x--x--x
                             \
                              --d1'--d2' #SHA1 rewritten in deployment branch
                                         #not important since this branch 
                                         #is not pushed (published)

答案 1 :(得分:5)

这对我有用,我只进行了少量配置更改(配置文件中有3行)。

  1. 从GitHub或您保存的任何地方克隆您的存储库。到你想要部署的地方。

  2. 运行git checkout -b deployment origin/master

  3. 进行更改(如果您愿意,可以推送)。

  4. 每当您的主人(或您从中进行部署的任何分支)都要进行部署更改时,只需git pull --rebase

  5. 这是一个简单的解决方案,它肯定对我有用,我不能说话或者不这样做,这使得它像其他人所说的“shi * t”,但它对我们的目的当然非常有用。

答案 2 :(得分:4)

我做了一些愚蠢的伎俩,如:

  • 让应用阅读文件config
  • config.developmentconfig.production但不是config添加到存储库
  • 让您的部署脚本不仅克隆存储库,还要克隆cp config.production config

这有意义吗?

对我来说没问题。

答案 3 :(得分:3)

快速回答是,不要合并分支机构。实际上,您根本不需要合并它们,只需从开发(也称为“master”)合并到部署以合并修复和一般更改。

答案 4 :(得分:2)

如果您希望保持历史记录的良好性,可以将部署文件保留在干净分支的某些提交中。然后,在部署新版本的时候,检查部署分支和'git rebase master',将这些提交放在原始分支之上。

这样,您也可以轻松更改配置文件,并使用'git commit --amend'更改顶部提交。

答案 5 :(得分:1)

我之前提到了补丁文件。我现在已经离开了,而是维护部署分支。

即,我使用名为“master-deployed”的新分支分支master,并在该分支上进行更改,我只需要在构建服务器上的测试版本中进行更改(即添加警告,这不是实时版本,以及web.config中的不同数据库服务器。

构建服务器时,构建最新版本然后检出master-deployed,并在执行常规构建之前将其重新绑定到origin / master。如果没有人做出任何相互矛盾的变化,那么一切都很好。如果他们有,那么我无法看到任何系统处理这个没有人工干预。

同样适用于qa的尖端,其具有分支'qa-deployed'

我使用--onto标志来确保是否重写了整个分支,然后补丁不会接受所有旧的提交。

所以在构建服务器上,qa构建看起来像

git reset --hard
git clean -xfd
git checkout -f qa-deployed
git rebase --onto qa HEAD^ qa-deployed
build-script

答案 6 :(得分:1)

我遇到了类似的问题并创建了一个名为config-magic的小项目来帮助管理它。

Config-magic允许您创建模板配置文件,然后创建每个dev / staging / production的数据配置文件。然后运行“cfg dev”生成“dev”配置文件,“cfg staging”生成staging配置等。

然后我用脚本连接了脚本,这样当我部署到staging时,我在本地运行“cfg staging”,然后在从git更新代码库后scp覆盖所有配置文件。

git会忽略“实际”配置文件。到目前为止,这对我来说非常有效。

https://github.com/apinstein/config-magic/tree

答案 7 :(得分:1)

我正在为我的情况考虑所有这些解决方案,但它们似乎都没有适用。我在我的实时和开发服务器上编辑。 如果您不需要重新发布该分支,Rebase运行良好,但我在部署分支上进行更改并将这些更改发布回主存储库。 子模块方式仅在您的文件位于单独的子目录中时才有效,我的配置文件位于多个位置。 合并我们的方法也不会很好,因为我必须首先拉分支,然后是大分支。 也许它会工作,如果还有合并他们,我可以在需要时拉入正确的配置分支。 现在一个.gitignore工作,我只是手动上传文件。

经过更多的研究后,我发现我的解决方案是在实时网站上没有git repo,但是使用暂存网站将最新的更改用于暂存/实时配置文件。然后通过git archive部署并将文件解压缩到我的实时网站上。

答案 8 :(得分:1)

cherry-pick似乎对此有用(以牺牲日志污染为代价)。

git checkout -b测试 进行更改和提交 git checkout master git checkout -b deploy 进行更改和提交 git checkout master

在主人和主人之下做一切 git cherry-pick testing或git cherry-pick deploy,用于应用从当前系统切换到测试或部署版本所需的差异。

答案 9 :(得分:0)

目前我已经签入了几个补丁文件,构建服务器会为相关版本应用这些补丁。虽然我现在对它有第二次想法

答案 10 :(得分:0)

这很简单。

您可以创建一个部署分支,如:

> git checkout deployment-1234

现在,您可以进行特定于部署的更改。完成后,提交它:

> git commit -as

回到你的主分支。

> git checkout master

立即合并部署分支。这将使用特定于部署的更改修改您的主分支,但不要担心,我们将还原它。

> git merge --no-ff deployment-1234

要恢复更改,只需在合并之前签出文件并通过修改提交。

> git checkout HEAD^ .
> git commit --amend

那就是它。现在,git将主文件已经考虑过的第一次部署-1234提交中的文件更改视为不合适。因此,即使您尝试将整个部署-1234分支合并到主分支,它也永远不会将这些更改添加到主分支。 (试试吧!)

我还在需要更好控制的项目中使用另一种方法。上面的坏处是,您可能会在将来从deployment-1234到master的合并期间产生冲突。如果那些合并是手动的,那也没关系。但是如果你需要自动合并,那么我可以更好地防止这种系统冲突。因此,我创建了一个脚本,可以应用和撤消特定于部署的更改。然后,更改本身不需要在存储库中,而是在repo中显示的是该脚本。