2011-01-19 7 views
7

He encontrado un comportamiento que no esperaba de Subversion, y lo descubrí casi accidentalmente: un archivo modificado no se marca como modificado.¿Por qué Subversion no marca un archivo de hoja de cálculo de Microsoft Excel modificado?

Tengo una prueba de unidad que implica una hoja de cálculo de Microsoft Excel como archivo de entrada. La prueba unitaria calcula una suma de comprobación CRC; mi prueba comenzó a fallar debido al cambio en la suma de comprobación.

El archivo de prueba se almacena en SVN, y tiene el tipo MIME "application/octet-stream", y por lo tanto se considera binario por SVN.

Obtengo el mismo comportamiento de TortoiseSVN y el cliente de línea de comandos SVN, en este caso ambos basados ​​en SVN 1.6: cuando el archivo se abre en Excel, el hecho de que esté abierto debe codificarse en el archivo; SVN muestra que el archivo está modificado. Sin embargo, cuando el archivo se cierra de nuevo (sin guardar), parece volver a su estado no modificado: es decir, svn status no muestra el archivo de Excel; svn diff no produce salida de todos modos debido a que los datos son binarios.

El problema es que el archivo ahora no se compara binariamente con el archivo almacenado en el repositorio. (Si se exporta una copia nueva, no se compara binariamente con la copia abierta y cerrada.) El archivo aparentemente no se modifica desde el punto de vista del usuario, por lo que, en un sentido semántico, la respuesta SVN es razonable. Pero no sintácticamente; y SVN es esencialmente sintáctico.

La parte para la cual no puedo encontrar un motivo es porque SVN no marca el archivo como modificado. No puedo imaginar que SVN tenga un manejo especial para los archivos de Excel (y en cualquier caso el tipo MIME no es específicamente uno asociado con MS Excel); no hay una propiedad de palabra clave SNV definida. Del mismo modo, me imagino que Excel sabe algo sobre el contenido del subdirectorio .svn oculto en el que se almacena la información de copia de trabajo SVN.

¿Tiene alguna pista sobre lo que está pasando aquí?

Gracias, Rob.

Respuesta

3

Excel siempre bloquea los archivos abiertos, estableciendo la marca de tiempo en la fecha actual. Cuando cierre sin guardar, Excel revertirá la marca de tiempo. Esto hace que SVN ignore el archivo.

En cuanto a los contenidos modificados, no estoy seguro. ¿Puedes reproducir el problema?

+0

Gracias. Sí, el problema es reproducible. Esto parece una explicación probable; Casi lo había dicho en mi comentario a la respuesta de Wim, pero es bueno tenerlo observado independientemente. Voy a verificar esto (en el trabajo, mañana). – Rhubbarb

+0

Solo para confirmar: eso es exactamente lo que está pasando. Cuando se abre el archivo de Excel, el contenido del archivo cambia (como se puede ver con, por ejemplo, md5sum) y los cambios de hora modificados. Cuando el archivo se cierra sin guardar, el contenido del archivo no cambia, pero tampoco vuelve a su estado original; y el tiempo modificado vuelve al valor antes de abrir. – Rhubbarb

+3

Acabo de encontrar esto: http://spreadsheetpage.com/index.php/oddity/who_last_opened_that_file/ parece que Excel guarda el nombre del abridor (y tal vez más), incluso si no guarda. Extraño. – Martin

1

¿Es posible que el archivo esté bloqueado por excel mientras está abierto y svn no puede acceder a él para ver si ha cambiado o no?

+0

Creo que las aplicaciones de MS suelen indicar el bloqueo en un archivo oculto por separado (algo así como '~ file.doc'), pero creo que Excel es diferente. Locking es una pista, pero no creo que esa sea la historia completa, y no creo que se impida el acceso. (Necesito experimentar más.) – Rhubbarb

4

Subversion asume que la marca de tiempo de "última modificación" no está mintiendo. Si la marca de tiempo no cambia, el contenido del archivo no se verifica para detectar cambios. Creo que todo el sistema de control de versiones hace esto; si no, las modificaciones locales serían insoportablemente lentas.

edit: para los detalles de cómo funciona SVN en este sentido, questions.c en la fuente de la biblioteca de copia de trabajo SVN es un buen comienzo.

+1

Justo lo que estaba a punto de sugerir, compruebe la marca de tiempo :-) He tenido algunos problemas extraños en los que no se ha establecido correctamente y que eran notablemente similares a este. – berry120

+0

Nuevamente, una buena sugerencia. Gracias. Pensé que había visto la marca de tiempo actualizada.Me pregunto si Excel cambia la marca de tiempo al abrirla, pero la cambia nuevamente al cerrar-sin-guardar. Volveré a verificar (más detenidamente) más tarde. – Rhubbarb

+0

Gracias también por el enlace en su edición. – Rhubbarb

Cuestiones relacionadas