避免覆盖的关键不是让两边“小心一点”,而是先确定同一时间只有一个写入方:把改动拆成互不重叠的文件与目录,用版本库分支或临时只读冻结划清边界,并在合并前用文件指纹核对。只要两个服务商都能直接写生产环境,覆盖迟早会发生。
覆盖通常有三种可区分的原因。第一种是同一文件被两边先后上传,后上传者把先上传的内容整体替换。第二种是模板、样式或脚本被两边分别修改,各自只看到自己的版本,合并时丢掉对方改动。第三种是数据库或配置被两边同时改动,表面文件没冲突,实际数据已经错乱。
区分方法很直接:对比服务器上文件的修改时间和内容指纹,如果同一路径在短时间内出现两个不同版本,就是文件级覆盖;如果文件没变但页面表现异常,优先查数据库和配置。这个判断决定了下一步是加锁还是拆分。
以下为假设情境,用于说明决策过程。某昭通本地企业的网站需要同时做两件事:A服务商调整产品页模板与样式,B服务商补充新闻栏目和表单逻辑。两边都拿到生产环境账号,各自改完直接上传。结果是产品页样式被新闻栏目的旧模板覆盖,表单改动又冲掉了产品页的脚本。
常规做法是让两边沟通,但沟通没有解决,因为缺少一个可核对的写入边界。遗漏的条件是:没有人规定“谁在什么时间可以写哪些路径”。
先列出一份路径清单,把改动按目录分开。例如模板与样式归A,新闻栏目与表单相关文件归B。两边都不修改对方目录下的文件。如果确有交叉文件,指定一方先完成并冻结,另一方基于冻结后的版本再改。
时间上采用窗口制:约定A在某个时间段内写入,B在此期间只读;完成后A通知B拉取最新版本,B再写入。窗口不必很长,关键是同一时刻只有一个写入方。动作上,要求每次上传前先下载当前版本并记录文件指纹,上传后再核对一次。这个动作的结果是:如果指纹不一致,说明有并发写入,应立即停止而不是继续覆盖。
如果两边都熟悉版本控制,最稳妥的方式是各自在分支上改,由一方负责合并。合并前先对比差异,确认没有把对方改动删掉。合并动作由一个人执行,另一个人只提交不直接发布。
如果暂时没有版本库,就采用临时冻结:把生产环境设为只读,两边在本地或测试环境改,改完由指定人员统一发布。冻结期间不接受任何直接上传。这个取舍的代价是发布节奏变慢,但换来的是可核对的单一写入源。
核对通过后再发布,发布后立即抽查关键页面与表单。如果抽查发现异常,先回退再排查,不要在异常状态上继续叠加改动。
最后把路径归属、写入窗口、合并责任人和回退方式写成简短约定,两边确认。约定不需要复杂,但必须明确谁在什么时间可以写哪些内容。这样即使两边同时有任务,也不会因为缺少边界而互相覆盖。