版本控制——非SVN管理图片和声音文件

Jin最近负责的英语学习产品就快要上线了,这款新产品是公司的主产品。按照公司规定,必须通过测试部门的最终测试才能正式发布!按照以往的经验,Jin填写了一份测试申请,上面很详细的写出如何更新数据库,如何从SVN中更新代码到服务器,还有如何复制图片和声音文件。对于新产品的上线,Jin还是很重视的。

Jin把测试申请提交到小宋那里,小宋回复说测试申请审核通过,就可以测试和发布。小宋是一个个子不算高,很年轻的阳光男孩。他刚刚当上测试部经理不久,能在20岁冒头就当部门经理,Jin觉得他很幸运。新官上任三把火,小宋最近经常被更高级的领导训斥,真是阳光遇挫折,猛虎遇群狼。小宋告诉Jin,测试申请不合格,被打回!听完这话,Jin就是一愣。测试申请按照规定格式填写的,怎么会不合格呢?小宋给Jin看了高级领导老陈的谈话记录,老陈说:“任何需要测试和发布的内容,都必须有版本控制!而Jin提交的测试申请中,图片和声音文件根本没有进行版本控制”。看到这里,Jin心想,看来图片和声音文件也要签入到SVN。继续往下看老陈的说的:“使用SVN管理二进制文件是错误的!而且图片和声音文件足有好几个G,全部放到SVN进行管理,会笑死人”。按照常理,Jin肯定会开始抓狂,脾气就像山洪暴发一样……不过这次Jin没有这样。

老陈,据传说是一个超级牛人,在某大公司做过高级主管,还参与过Linux内核开发。这次是和公司老总一起出来创业,掌握着产品质量关。老陈平时不苟言笑,带着一副很深的眼镜,看起来是个知识分子。另外据说,老陈对Jin赞赏尤佳,所以应该不是在刁难自己。基于以上两点,Jin心里还保持着一种平和。再怎么说也不能得罪一个自己的牛人粉丝。

即要对声音和图片进行版本管理,但又不能使用SVN!这简直就是一对矛盾。Jin怎么也想不明白,最后实在没招了,只好鼓起勇气当面去问老陈。老陈的答复倒也挺简单,他说自己只要结果,不管我怎么进行版本控制。只要能进行版本演算,能回朔就可以!Jin听到这里,还是感觉不理解,但是也不好再多问什么了。回到自己座位上,Jin思来想去,渐渐觉得版本演算和回朔,应该是版本控制的一个关键。不使用SVN,应该也可以达到同样的目的。于是Jin写出了以下文字:

概述

为了能够回朔每次修改的内容,单词图片和声音文件也需要进行版本控制!但是使用SVN进行版本控制,并不合适。原因有两个:一是图片和声音文件都属于二进制文件,无法比较也没有必要比较版本之间的差异;二是图片和声音文件数量很多且体积也很庞大,全部加在一起有2G多,签入或签出到SVN会非常耗时;

解决方法

介于以上两个原因,采用目录结构来进行版本控制。具体目录结构如下:

* 基础版本目录

用于存放最原始版本的文件。该目录命名为base;

* 版本列表目录

用于存放每次修改时添加的新文件和删除的旧文件。该目录以日期格式命名,例如20100310。添加的新文件将被放置在insert目录中,例如20100310/insert,删除的旧文件将被放置在delete目录中,例如20100310/delete;

* 结果目录

用于存放演化结果文件。该目录命名为result;

整体目录结构形式如下:

root/

 |

 +-- base/

 |

 +-- 20100310/

 |      |

 |      +-- delete/

 |      |

 |      +-- insert/

 |

 +-- 20100311/

 |      |

 |      +-- delete/

 |      |

 |      +-- insert/

 |

 +-- result/

举个例子:

在base目录中存放着A.jpg、B.mp3、C.flv,那么演化结果如图1所示:

 版本控制——非SVN管理图片和声音文件

(图1)从基本版演变结果

在2010年3月10日,更新了A.jpg并添加了D.gif,那么演化结果如图2所示:

 版本控制——非SVN管理图片和声音文件

(图2)从20100310版本演变结果

注意,更新操作被认为是删除和插入的组合操作!先删除后插入。

在2010年3月11日,删除了C.flv并添加了E.flv,那么演化结果如图3所示:

 版本控制——非SVN管理图片和声音文件

(图3)从20100311版本演变结果

从基础版本演变

我们可以从基本版本开始,以向下迭代的方式演变到任何指定的版本!其算法过程是:

  1. 读取基本版数据,作为演算基础;
  2. 遍历第1个版本,读取delete目录中的内容,将这些内容从基本版数据中删除;读取insert目录中的内容,将这些内容插入到基本版数据中;
  3. 重复第2步,遍历第2、3、4……、N版本;
  4. 最终结果将存放在result目录中;

从结果回朔

我们可以从结果开始,以向上迭代的方式回朔到任何指定的版本!其算法过程是:

  1. 读取结果数据,作为回朔基础;
  2. 遍历最后版本,读取insert目录中的内容,将这些内容从基本版数据中删除;读取delete目录中的内容,将这些内容插入到基本版数据中;
  3. 重复第2步,遍历倒数第2、倒数第3、倒数第4……、倒数第N版本;
  4. 最终结果将存放在result目录中;

Jin重新填写了一份测试申请,在说明如何复制图片和声音文件的地方标准了版本号,这回顺利通过。Jin有了一个总结,工作中领导并不是要有意为难自己,和作风严谨的领导交谈,必须保持头脑清醒。如果领导真的是有意为难自己,那么也要顶住!因为这正是自己成长的机会。

用目录结构解决版本控制的方法有了,下周还要给老陈写一个小工具代码……

相关推荐