我遇到了一些我没想到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子目录的内容。
你有关于这里发生了什么的线索吗?
谢谢,Rob。
答案 0 :(得分:4)
Subversion假设“最后修改”时间戳没有说谎。如果时间戳未更改,则不检查文件的内容是否有更改。我认为所有版本控制系统都会这样做,否则检查本地修改会无法忍受。
编辑:有关SVN如何在这方面工作的详细信息,SVN工作副本库中的questions.c是一个良好的开端。
答案 1 :(得分:3)
Excel始终在打开时锁定文件,将时间戳设置为当前日期。当您关闭而不保存时,Excel将恢复时间戳。这会导致SVN忽略该文件。
至于改变的内容,我不确定。你能重现这个问题吗?
答案 2 :(得分:1)
文件在打开时是否被excel锁定,而svn无法访问它以查看它是否已更改?