公司的项目原先是使用svn作版本管理,发布项目的时候是采用打包的方式压缩成zip格式的文件,而后用ftp上传。随着开发人员愈来愈多,需求变 化也比较多,常常在开发新功能时要调整线上的问题,在一个分支上进行开发就很是不方便。虽然svn也支持多分支开发,可是操做很是不便,因而就把项目的版 本管理切换成了git。linux
切换成git以后,为了平缓的过分,发布项目的时候仍是打算使用打包的方式,而后ftp上传。那么问题就来了:git如何提取出两个提交之间的差别文件呢?git
一开始找了git format-patch和git archive都没有找到须要的功能,后来就去查git diff命令,找到了方法。svn
git diff这个命令能比较两个提交之间的差别,使用–name-only参数能够只显示文件名。例如:3d
$ git diff 608e120 4abe32e --name-only
git diff列出两个提交之间差别的文件orm
这个输出结果很是有意思,就是差别文件的相对地址,不正好是压缩命令的参数吗?因而立马使用压缩命令blog
$ zip update.zip c/environ.c ... 全部的文件...
就能成功打包了。只是这样的话也太麻烦了吧,幸亏linux有提供一个命令xargs能将前一个命令的输出转成另一个命令的参数,按照这个思路就很是简单了。排序
$ git diff 608e120 4abe32e --name-only | xargs zip update.zip
结合xargs进行打包ip
总结开发
其实这种发布方式并非很是好,若是线上的环境也能使用版本管理就很是方便了,只是这须要多方面的的配合。从某种意义上来说,这种打包更新方式只是一种折中的处理方式。it
还一个问题是这样的:提交的排序是按照时间来进行的,若是有分支合并进来的,可能分支里的提交时间在上次发布的提交时间以前,这样是否会漏打包到文件呢?不会的,由于合并分支会产生一个新的提交,这个提交必定是在上次发布的提交以后。