# 版本管理反模式(2026-07-01 反委托代发工资协议惨痛教训) ## 事件回顾 反委托代发工资协议需要制作两个版本(法定安排 vs 反委托保护),同时保留华诚-Z的修订痕迹。 ### 灾难链条 1. 原始文件有华诚-Z的修订(author="华诚-Z")+ 批注 2. 我制作WB版本时,把所有author改成了WB 3. 又做了一版合并版本,再次覆盖 4. 之后Doro说"你把华诚-Z修订痕迹的版本放进去" 5. 发现/tmp里所有文件都只有WB作为author 6. Nextcloud版本历史也没有(只保留了一个.v文件,也是WB) 7. 最终在 `/tmp/v1_doro_updated.docx` 找到——这是一个中间版本,纯属侥幸 ### 反模式清单 | 反模式 | 后果 | |--------|------| | 修改author前不备份 | 原始修订痕迹不可逆丢失 | | 覆盖式保存(同文件名) | 中间版本消失 | | 从头重做而非增量修补 | 每次重做都覆盖上一版 | | 不验证就交付 | 批注丢了3条没发现 | | 多轮操作共用/tmp目录 | 后续操作的文件名与前面冲突 | ### 正确做法 ```python import shutil from datetime import datetime # 操作前备份 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') shutil.copy(source, f"{source}.bak_{timestamp}") # 操作后验证 import zipfile, re z = zipfile.ZipFile(output) content = z.read('word/document.xml').decode('utf-8') authors = set(re.findall(r'w:author="([^"]+)"', content)) assert '华诚-Z' in authors, "华诚-Z author LOST!" # 批注验证 if 'word/comments.xml' in z.namelist(): comments_xml = z.read('word/comments.xml').decode('utf-8') comment_count = len(re.findall(r'= expected_count, f"Comments lost: {comment_count} < {expected_count}" ``` ### 文件命名规范(防覆盖) 不要用 `_v2.docx` `_v3.docx` 这种递增命名——容易忘记当前版本是几。用语义+时间戳: ``` 反委托_华诚Z原版_20260701_0320.docx # 带华诚-Z修订的版本 反委托_WB合并版_20260701_0341.docx # WB+华诚-Z合并后 反委托_V1法定安排_FINAL_20260701.docx # 最终交付 ```