问一个git的问题嘛~

2012-08-18 16:29:15 +08:00
 Rabbit52
是这样得,我的项目要往服务器上部署嘛,但是服务器的配置文件是要修改的,然后修改之后下次使用 git pull 的时候提示我有未提交的修改不要我更新

可不可以像SVN那样嘛,update顶多会产生冲突
4713 次点击
所在节点    程序员
27 条回复
marvinlix
2012-08-18 16:32:14 +08:00
先git stash把本地为提交的缓存起来,git pull之后再去出来
Rabbit52
2012-08-18 16:36:03 +08:00
@marvinlix 谢谢,我试下看看
Rabbit52
2012-08-18 16:42:38 +08:00
@marvinlix 喔,这个果断行!谢谢
9hills
2012-08-18 17:27:41 +08:00
这种stash然后再apply的方式是可行的,但还不够自动

你最好的方法就是在服务器上checkout -b一个deploy分支。master分支所有机器上都要一致,就是你的代码主分支。然后在deploy分支你就可以commit服务器上对配置文件的修改。以后master分支有更新的时候,你只需要在deploy分支merge一下master分支就可以了,这样你服务器上的配置也会被git管理起来,很方便。

而且deploy分支只是服务器上的本地分支,没有push出去,不存在泄露你服务器上配置(比如密码,token等)的风险。

再延伸,你甚至可以写一个钩子,让这些工作自动化,这样你只要在开发环境push一下,就能自动部署了
imcotton
2012-08-18 17:47:20 +08:00
git update-index --assume-unchanged
kingwkb
2012-08-18 17:54:46 +08:00
@9hills deploy没有push出去的话,那么在本地可以把代码merge到deploy分支吗,我没怎么用过git,一直svn,现在大家都用git做为部署工具了吗?这样有不好的地方吗? 好的话就切换到git去
Rabbit52
2012-08-18 18:06:33 +08:00
@9hills 谢谢,哪天试看看!
9hills
2012-08-18 18:28:54 +08:00
@kingwkb 可以。git作为部署工具的好处是可以写钩子,全自动化。只要你本地push一下master,服务器那边就自动部署了,不用你再ssh到服务器,cp代码,reload/restart服务


@Rabbit52 这种方法当你在master中对配置文件进行升级后,merge时有可能会冲突。但这个是必须手动处理的。。。随便什么工具,代码冲突必须得手动处理的。。。你可以在钩子函数中加上相关判断,如果需要手动处理则邮件你之类的
Rabbit52
2012-08-18 18:54:34 +08:00
@9hills 嗯,懂了。谢谢你哦,写了这么多
aleung
2012-08-18 21:38:02 +08:00
配置数据不应该跟源代码放在一起吧,放个配置文件模板,另外用脚本去更新配置文件
agassi_yzh
2012-08-19 17:28:09 +08:00
不知道你用什么语言写的哦。我用php根据apache的ServerAdmin来判断环境。

如果开发用dev,服务器上生产环境用production。在php代码中判断就好了。不需要在服务器上操作啊。
clino
2012-08-19 21:53:14 +08:00
也可以在本地先提交,然后 git pull --rebase
supersheep
2012-08-26 12:34:09 +08:00
有些点看得不是太明白。
按照自己的理解,是不是说我在客户端 push 了之后
在服务器端
checkout master ,pull , checkout deploy, merge master呢?
但是这样checkout master的时候服务器上配置会不正确
是哪个地方理解错误了,请大家更正。
NemoAlex
2012-08-26 14:53:04 +08:00
@supersheep 服务器不要老在分支之间 checkout 啊,业务还在进行的同时,这改来改去吃得消么
可以在 deploy 分支执行“git fetch --all”把所有的分支都更新下来,然后“git merge master”

不过最好的办法,也是我建议诸位做的:把配置集中在一个或者少量的配置文件里,在版本控制系统中维护一份配置文件的模板,ignore 掉真正的配置文件
在配置文件内容有修改的时候,手动维护服务器上的配置文件与模板保持一致
clino
2012-08-26 15:49:14 +08:00
建议多用rebase少用merge,其实svn的方式相当于rebase做完以后一条线,git merge做多了版本图太复杂
supersheep
2012-08-26 16:00:58 +08:00
@NemoAlex 嗯,还没正式开业所以敢这么干。这个思路大概理解了,多谢,之前也是觉得应该把配置放在ignore中,怕就怕一多自己忘了。配置文件的模版可否理解为开发环境中的配置?不然每次改动手动维护模版也会比较吃力吧。
Rabbit52
2012-08-26 16:11:29 +08:00
@NemoAlex 这个方法挺好诶,版本库里面只有配置文件的模板,然后在不同环境重命名出来,直接将它忽略掉!
dn
2012-08-26 16:28:28 +08:00
为安全计最好不要用git来更新生产环境配置文件

我这边的解决方案是,check in的文件名是:config.default.js ,然后使用的文件是config.js
并且需要把config.js放弃.gitignore 文件中。

这样git pull的时候不会有merge问题。

代码更新之后,diff配置之后,手动更新配置文件。

然后重启项目,运行
Rabbit52
2012-08-26 17:00:20 +08:00
@dn 还有 .gitignore 这个,我才学到,跪谢!!!!
hpyhacking
2012-08-26 18:53:06 +08:00
@Rabbit52 .gitignore不能解决你的问题,这个文件一样要放在库中共享,你单独对服务器上的版本进行修改一样会收到更新提示。整个的问题属于部署范畴,好的解决方法是不要去理会什么开发环境中的配置文件,生产环境通过部署覆盖一份私有的配置文件即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/45479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX