用git做php代码的版本控制总结

以前我一直搞不懂git,自从我用了sourcetree以后我马上就学会了。

我认为git工作流最重要的一步就是安装一个好用的GUI(自少对我来说如此),而不是从打开命令行敲git命令。我这么说一定有人马上出来反驳我说git命令更快捷,而且能加深对git底层原理的理解等等,现在网络任何比较热门的git教程基本都是从原理到命令行一步一步教你敲出来的。我也是这么学下来的,但是老实说我仍然遇到了很多困难+很多git特性我搞不懂想不通。直到有一天我安装了sourcetree,我突然就把git的方方面面都搞懂了,究其原因是因为GUI把git的特征完全展现在了我眼前,remotes、branches、stash、fetch、pull、push、rebase、cherry-pick、revert、discard、merge和tag我一下子都懂了,而且操作起来直接点两下就完了。我突然意识到git的很多东西如果换到bash下做会很麻烦。其实很多技术、框架虽然社区叫好也有人用,但是实际尝试横向比较以后真的是盛名之下其实难副,叫好的那些人估计也是按照网上教程一步步克服困难走下来成功了,然后就敝帚自珍觉得自己掌握的东西是最好的,然后发声说这个好而不懂得横向比较。总之我养成了redis、mongo、mysql以及ES没有GUI管理工具不干活的习惯,命令行很酷么?i don’t care…don’t make me think, i just want to click and get thing done.

总之把sourcetree装上以后,就愉快的干活吧。

我用git做版本控制除了多人合作以外,另一个用处就是方便部署更新(尤其是脚本语言)。现在多人合作的workflow在coding.net的模式中是内部私有项目大家公用同一个repo,不同的人只有推送自己分支的权限,如果要把自己的分支合并到主分支则需要发merge request(MR)由repo的管理者review代码后进行合并。而公有的项目则采取github的模式,fork了repo以后定期从原repo做pull,为了保持线性做rebase然后push到自己fork的repo中,最后给原repo发pull request(PR)。

我这里就以php项目的git版本控制来说,首先任何项目都会遇到依赖问题,而依赖是否包含在git中是个问题,这涉及到开发环境一致和部署问题。实际上很多二进制依赖没法纳入git管理,开发环境和生产环节第一次直接copy,以后就走git了,这是可以接受的,但是第三方库依赖会变化就需要考虑更多了。php的composer依赖作为纯的php代码本身就是跨平台的,直接把vendor下的依赖放入git中有个好处就是依赖改变了生产环节直接git pull就ok了,方便的不行。然而有的脚本语言只能把第三方库安装到全局,这就导致依赖部署的时候需要从新安装,这会导致一致性问题和第三方库的更新问题。

php的composer有个问题就是由于直接从github拉取代码,需要很好的网络环境,如果你的网络环境不好的话容易更新失败,有个很好的办法就是在阿里云上用git把php的repo拉下来再用composer安装,安装好后把vendor目录打包下载就ok了(当然你也可以直接把vendor纳入git管理中)。记得把composer.lock也纳入git管理中,阿里云上由于更新了composer依赖所以composer.lock也更新了,把更新push到repo中,这边开发环境再pull下来,这样就完成了composer依赖的安装了。

我本人用的workerflow目前只有自己用在小的php爬虫项目上所以并不复杂,而且各个应用虽然在同一个repo中但是相互独立,开发和部署全部在master上(笑)。定期从github上pull框架更新,自己又有coding.net等别的一些repo,多个repo之间合作用sourcetree可以看的很清楚,操作起来轻轻松松,我就不多说了。

用docker部署php代码的时候,考虑到代码更新我是这么做的。首先vendor不加入git管理,然后直接把部署私钥copy进docker镜像,然后在镜像系统中安装cron和git,然后在cron中定期git pull来更新代码。需要注意的是php官方的docker镜像基于debian的jessie,不含有cron进程,所以启动docker时候命令应该类似cron&&pfp-fpm这样。我个人对shell不是很熟,所以shell操作我都是用php的一票exec系统调用搞的,看个人偏好了。这样只要代码被push到了repo,生产环境就自动拉下来了,当然了我代码比较简单没有ci啥的,以后可以加。

最好不得不说一个git和docker的坑,我们知道.git目录下的git二进制数据是跨平台的,我在win下开发然后永dock for win10来build docker镜像,把git目录copy到docker镜像中时运行的时候发现git status源码全改了。去爆栈上问了才知道是git在win下check out时会把\n换成\r\n,而存的时候总是存\n,所以直接copy到docker中会出现这个问题,此时只需要把git默认check out的换行改成\n就ok了。这样git目录在镜像中一样能用。
总之,git的workerflow很简单,如果,直接co你有个好用GUI工具的话。

用git做php代码的版本控制总结》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注