我遇到了一些我没有预料到的 Subversion 行为,并且几乎意外地发现了这一点:修改的文件没有被标记为已修改。
我有一个单元测试,涉及 Microsoft Excel 电子表格作为输入文件。单元测试计算CRC校验和;由于校验和更改,我的测试开始失败。
测试文件存储在 SVN 中,并且具有 MIME 类型“application/octet-stream”,因此被 SVN 视为二进制文件。
我从 TortoiseSVN 和 SVN 命令行客户端得到相同的行为,在这种情况下都基于 SVN 1.6:当在 Excel 中打开文件时,它打开的事实必须在文件本身中进行编码; SVN显示文件已被修改。然而,当文件再次关闭(不保存)时,它似乎又回到了未修改的状态:即 svn status 不列出 Excel 文件;由于数据是二进制的,svn diff
无论如何都不会产生输出。
问题是该文件现在不与存储在存储库中的文件进行二进制比较。 (如果导出新副本,则它不会与打开和关闭的副本进行二进制比较。)从用户的角度来看,该文件显然没有变化,因此从语义意义上来说,SVN 响应是合理的。但在语法上却不是这样;而SVN本质上是语法性的。
我找不到原因的部分是为什么 SVN 没有将文件标记为已修改。我无法想象 SVN 对 Excel 文件有任何特殊处理(并且在任何情况下 MIME 类型都不是专门与 MS Excel 相关的类型);没有定义 SNV 关键字属性。同样,我可以想象 Excel 了解有关存储 SVN 工作副本信息的隐藏 .svn 子目录的内容的任何信息。
您对这里发生的事情有任何线索吗?
谢谢,罗布。
最佳答案
Subversion 假定“最后修改”时间戳没有说谎。如果时间戳未更改,则不会检查文件内容是否发生更改。我认为所有版本控制系统都会这样做,否则检查本地修改将会慢得难以忍受。
编辑:有关 SVN 在这方面如何工作的详细信息,questions.c SVN 工作副本库的源代码是一个好的开始。
关于excel - 为什么 Subversion 无法标记修改后的 Microsoft Excel 电子表格文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730452/