2011-08-06 15 views
13

He convertido un repositorio de Mercurial a Git, usando la exportación rápida. Pero el repositorio de Git es enorme: 18 GB para Git frente a 3,4 GB para Mercurial. Ninguno de mis pasos de limpieza me ayudó.¿Por qué mi repositorio Git es mucho más grande que la versión Mercurial?

Mi repositorio Mercurial está dominado por un archivo de 65 MB (tarjetas Anki en formato SQLite) que se actualiza diariamente. Su historial ha crecido a 2.9 GB, bajo .hg/store/data.

¡Tenía la esperanza de que Git pudiera comprimir el historial un poco mejor, pero no he podido reducir el repositorio por debajo de 18 GB!

He intentado git prune, git gc, y otros, inútilmente. Incluso intenté comprimir la carpeta .git, y aún resultó ser exactamente 18 GB.

¿Echo de menos algo?

Actualización: Probé Bazar (bzr), y comprimió mi repositorio a solo 2,3 GB. ¡Bonito!

+0

No sé por qué esto fue rechazado ... – Omnifarious

+1

¿Has probado 'git gc --aggressive'? – cdhowie

+0

Probé 'git gc --aggressive', pero murió después de un tiempo con un error de memoria. Pero en ese momento, el archivo de paquete temporal que estaba creando ya había excedido 5 GB ... no se veía mejor que 'git gc' que había ejecutado anteriormente. – slattery

Respuesta

7

Si el git gc falla, intente ejecutar manualmente un git repack y luego git gc.


Mis observaciones con SVN, Git y Hg:

Siempre han observado que SVN y Hg repositorios eran mucho más pequeños que los repositorios Git correspondientes. Esto se debe a que cada cambio en un archivo - texto o binario, agrega un nuevo objeto completo para él. En SVN, solo se agrega la diferencia, incluso en el caso de los binarios, y la diferencia binaria en SVN también es muy buena.

Pero aquí es donde entran los archivos del paquete, ya que almacenan solo diff (delta) entre objetos similares e incluso se comprimen. Incluso con el embalaje, he observado que los repositorios Git, dependiendo del tipo de archivos y la cantidad de cambios que sufren esos archivos, tienden a ser más grandes. Esto es algo que he llegado a aceptar con Git y es un compromiso que estoy dispuesto a tomar dada la rapidez con que las diversas operaciones son con Git.

+3

Mi experiencia entre SVN y git es exactamente lo opuesto. En los repositorios que he comparado, el git repo es algo así como 3-5 veces más pequeño que el SVN. –

+1

@ Ryan Stewart - Como dije, va a depender del tipo de archivos y la cantidad de cambios. Un repositorio con binarios medianos a grandes que cambian a menudo será más grande en Git que en SVN, incluso cuando está empaquetado. – manojlds

+0

Gracias @manojlds .. Fue decepcionante ver a Git ocupar mucho más espacio, pero creo que tengo que aceptarlo. Mantendré este repositorio en Mercurial por ahora. Quizás en el futuro, Git podrá almacenar este repositorio de manera tan eficiente como Mercurial. – slattery

9

Una razón podría ser que Mercurial tiene un formato de almacenamiento muy compacto que implica diffs, incluso para binarios. Y como usar diffs para volver a crear versiones puede consumir mucho tiempo, almacenará una instantánea completa tan pronto como el original diffs + excede el doble del tamaño de una instantánea completa.

Personalmente, intentaría almacenar un volcado de su base de datos sqlite en lugar del archivo de la base de datos en sí y ver de dónde lo saca. Puede ser mucho más eficiente.

No sé qué formato de almacenamiento de git es. Pero supongo que no involucra diffs de la misma manera que Mercurial.

+3

Git realiza compresión diferencial también, seguido de un pase de zlib sobre el paquete. – cdhowie

+0

Gracias por la información. Estoy decepcionado de no haber podido cambiar cómodamente este repositorio a Git. – slattery

+6

+1 por sugerir un volcado de sqlite en lugar de versionar el propio db. Git (y Mercurial también en realidad) está destinado principalmente a ser un * sistema de control * fuente *, no un sistema de control de versiones para todo tipo de datos. Por supuesto, ciertamente puede manejar cualquier cosa que le arrojes; solo podría ocupar una tonelada de espacio. – MatrixFrog

0

Corriendo git gc --aggressive en un repositorio migrado de Mercurial funcionó para mí. Se redujo de 500 MB a 150 MB.

Cuestiones relacionadas