2010-02-25 27 views
47

Leo el libro de subversión y para mí está claro que subversion no almacena archivos individuales, sino solo deltas para minimizar el espacio en el disco. Subversion también hace lo mismo con los archivos binarios (esto solía ser una gran debilidad del CVS).¿Cómo almacena exactamente subversion los archivos en el repositorio?

Sin embargo, no entiendo el mecanismo exacto. Cuando confirmo un archivo, ¿qué sucede?

  1. Subversion almacena sólo el diff (y ya tiene la versión antigua)
  2. Subversion elimina la versión anterior, almacena el nuevo archivo intacto y crea un diff inversa con el fin de "re-crear" la versión anterior si necesario.
  3. Algo más que no he pensado.

El primer caso podría parecer el más lógico. Sin embargo, esto plantea otra pregunta. Si tengo en un repositorio de subversión un archivo con 1000 commits y un nuevo desarrollador revisa una copia limpia, entonces subversion debería buscar la versión original (importación inicial) y aplicar 1000 diffs antes de devolver el resultado. ¿Es esto correcto? ¿Hay algún tipo de almacenamiento en caché para los archivos donde también se guarda la última versión?

Básicamente, ¿dónde puedo encontrar información sobre el repositorio svn interno?

Actualización: Aparentemente el backend de la subversión juega un papel importante en esto. En el momento o escribiendo, FSFS usa la opción 1, mientras que BDB usa la opción 2. Gracias msemack!

+0

pequeña corrección: "Las versiones posteriores de la subversión también hacer lo mismo con los archivos binarios así". Subversion SIEMPRE ha hecho esto (al menos desde la versión 0.3.x). –

+1

posible duplicado de [rendimiento de SVN después de muchas revisiones] (http://stackoverflow.com/questions/127692/svn-performance-after-many-revisions) –

+0

También encuentro esto muy confuso. Hay varios back-ends disponibles, bdb y fsfs. Luego hay documentos sobre "burbujas arriba", skip-delta que parecen contradecirse entre sí. ¿Cuál es la forma actual en que un repositorio svn predeterminado almacena sus archivos? – Thomas

Respuesta

12

Dado que el formato del repositorio de Subversion es completamente interno, son libres de cambiar la representación de una revisión a la siguiente. Creo que la revisión actual generalmente almacena deltas inversas (su opción 2), pero también almacena instantáneas completas periódicamente para que no tenga que resolver 1000 diffs antes de devolver un resultado.

Las notas de la versión de Subversion 1.6 tienen una sección en Filesystem storage improvements que contiene algunas notas al respecto y enlaces a otras fuentes. Basta con decir que los detalles del almacenamiento de datos de Subversion son complejos y están sujetos a cambios.

También hay un documento de diseño en el árbol de fuentes de Subversion que describe el uso de skip deltas in Subversion. En general, el directorio /notes/ contiene varios documentos útiles sobre las funciones internas de Subversion.

7

Del documento Subversion Design (que está bastante anticuado, sin embargo) se puede conseguir esto:

Al igual que muchos otros sistemas de control de revisión, Subversion almacena los cambios como las diferencias. No hace copias completas de los nodos; en su lugar, almacena la última revisión como texto completo, y las revisiones anteriores como una sucesión de diffs inversas (la palabra "diff" se usa libremente aquí - para archivos, significa vdeltas, para directorios, significa un formato que expresa cambios en directorios).

No creo que haya cambiado desde entonces.

También, vea Bubble-Up Method.

+3

El documento de diseño al que se ha vinculado se refiere al antiguo formato de base de datos Berkeley DB, que SVN ya no usa como valor predeterminado. –

1

Cada vez que confirma un cambio, los repositorio almacena una nueva revisión de ese árbol general repositorio, y etiquetas del nuevo árbol con un nuevo número revisión. Por supuesto, la mayoría de el árbol es el mismo que la revisión anterior, a excepción de las piezas que han cambiado.

El nuevo número de revisión es una etiqueta secuencial que se aplica a la totalidad de nuevo árbol, no sólo a los archivos y directorios que tocado en ese revisión. Sin embargo, coloquialmente, se usa un número de revisión para referirse a el cambio cometido en esa revisión; por ejemplo, "el cambio en r588" ("r588" es la abreviatura de "revisión 588") significa en realidad "la diferencia entre los árboles del repositorio 587 y 588", o dicho de otra manera, "el cambio hizo a árbol 587 para producir árbol 588 ".

Tenga una mirada en: Subversion FAQ

3

la especificación normal FSFS podría ayudarle.

O si utiliza Berkeley DB, here's la especificación para eso.

FSFS usa deltas inversos para almacenar los cambios y skip-deltas para acelerar algunas acciones, si entendí todo correctamente.

Cuestiones relacionadas