我正在使用git进行PHP项目,我认为它非常方便。如果我让它发挥作用,有一件事情会很棒。
我创建了一个分支,用于部署。它有一些差异,比如不同的配置文件和文档。
我不能忽视它们,因为它们将留在两个分支中,而我想在两个分支中保持不同。
问题在于,当我合并分支时,那些意图不同的文件也会被合并。
有没有方便的方法来完成这样的事情?这通常是怎么做的?
答案 0 :(得分:11)
我不确定Git是否会以这种方式使用。
首先是快速Linus advice,总是“丰富多彩”且信息丰富;)
Git 非常从根本上跟踪项目状态,而不是文件状态。这意味着你非常不能尝试“合并文件”。在git中这是一个毫无意义的操作,事实上,任何允许它的SCM都注定要成为sh t()的一部分。
(*)我不是说那只是因为git不这样做。它比那更基础。一旦你开始进行每个文件的分支和合并,你基本上搞砸了自己,你将永远无法再将这个项目作为一个“整个项目” - 你不再拥有一个定义明确的历史记录是整个项目的历史。
有
那说,你可以:
此线程中的其他解决方案涉及在部署服务器上使用“特定于服务器”的分支
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行)。
从GitHub或您保存的任何地方克隆您的存储库。到你想要部署的地方。
运行git checkout -b deployment origin/master
。
进行更改(如果您愿意,可以推送)。
每当您的主人(或您从中进行部署的任何分支)都要进行部署更改时,只需git pull --rebase
。
这是一个简单的解决方案,它肯定对我有用,我不能说话或者不这样做,这使得它像其他人所说的“shi * t”,但它对我们的目的当然非常有用。
答案 2 :(得分:4)
我做了一些愚蠢的伎俩,如:
config
config.development
和config.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会忽略“实际”配置文件。到目前为止,这对我来说非常有效。
答案 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中显示的是该脚本。