2011-04-24 24 views
9

He estado aprendiendo Git las últimas semanas y me gusta mucho la forma en que funciona en comparación con SVN. La razón principal por la que estoy buscando cambiar completamente es que la fusión es supuestamente mucho más fácil con pocos conflictos y el hecho de que puedo cometer localmente. Esto promueve el uso de muchas ramas (como una rama por boleto/problema/tarea/etc.) y también promueve muchos compromisos. Solo uso ramas si lo necesito en SVN (ya que las fusiones a menudo producen conflictos) y solo me comprometo cuando estoy 100% seguro de que el problema es la corrección (en lugar de confirmaciones incrementales, que serían más agradables).Git vs SVN con archivos sin texto/grandes proyectos

Ahora, una preocupación que tengo sobre git como lo he estado leyendo es sobre archivos de texto/grandes proyectos. Por ejemplo, estoy trabajando en un proyecto de juego actualmente controlado en SVN. Ahora, con un proyecto de juego, habrá una gran cantidad de archivos que no sean de texto, como arte, sonido y otros archivos binarios, y algunos de los archivos pueden ser bastante grandes. ¿Qué tan bien maneja git un archivo que no es de texto/archivos binarios grandes? ¿Cuáles son algunas de las consideraciones que debo tener en cuenta si quiero exportar un proyecto como este a git?

+0

¿Ha considerado usar Artifactory o similar a archivos grandes de la tienda (versionados)? http://www.jfrog.com/artifactory – Nick

Respuesta

0

git maneja perfectamente los archivos binarios. Solo debes tener en cuenta que todas las versiones del archivo binario se guardan localmente. Si un archivo binario (digamos una imagen) cambia con frecuencia, terminará llenando su espacio local con toda la versión de la imagen.

+0

Según mi experiencia, git hace un buen trabajo al comprimir binarios. Simplemente recuerde 'git pack' o' git gc' de vez en cuando – sehe

+0

¿SVN maneja los binarios de manera diferente o de la misma manera que se menciona aquí (almacenando una copia completa del archivo para cada versión)? – ryanzec

+0

dado que con git tienes que tener un historial completo en tu repositorio local, consumirá más espacio que un proyecto svn. con svn si quiere retroceder en el tiempo, necesita el repositorio remoto para descargarlo (el servidor tiene todo el historial). con git ya tienes toda la versión localmente. – ALoR

5

Una de las grandes diferencias en cómo Git almacena datos en comparación con otros sistemas de control de versiones es que Git almacena el contenido del archivo completamente como un solo objeto. Eso significa que cada versión de cada archivo existe como un archivo completo en su repositorio (aunque está muy comprimido). Entonces, mientras que otro VCS almacena las diferencias/deltas entre dos versiones, y como tal maneja los archivos binarios y de texto de manera diferente (ya que los archivos binarios no son tan modificables), Git simplemente los maneja todos idénticos.

Como tal, trabajar con archivos binarios en Git no es diferente a usar cualquier otro tipo de archivo. Solo debe tener en cuenta que la creación de versiones de archivos muy grandes aumentará mucho el tamaño de su repositorio (ya que cada versión individual de ese archivo grande se almacena tal como está, incluso si el cambio binario real fue pequeño). Sin embargo, la compresión de Git funciona de maravilla y hace que no te des cuenta de esto por lo general. Especialmente si solo está hablando de los activos de un programa, probablemente no tendrá ninguna dificultad.

+9

Cada objeto es un archivo individual solo inicialmente. Después de las confirmaciones suficientes, o cuando el repositorio se '' gc''d, o cuando lo clona, ​​se deltificarán y empaquetarán, lo que hará que el tamaño del repositorio sea competitivo con un repositorio de subversión. –

+0

@jleedev: Lo que quise decir con "existe como un archivo completo" es que el archivo (contenido) se almacena por completo, no es que haya necesariamente un solo archivo que esté almacenando el blob. Como dije, la compresión que realiza Git es muy efectiva, por lo que normalmente no se da cuenta de que cada versión de archivo se almacena de forma independiente en el repositorio. – poke

+0

Simplemente depende de su nivel de abstracción. Pero es verdad que generalmente no lo notas. –

1

Añadiendo @ respuesta de empuje

Soy un usuario de Git ávido en estos días, pero después de haber trabajado en un gran proyecto en el que había un montón de archivos binarios - en su mayoría cremalleras - para ser manipulados - me encontré con SVN para ser más eficiente que Git. El tamaño del repositorio de Git se multiplicó en poco tiempo, mientras que el tamaño de un repositorio SVN similar no varió mucho. La clonación de un repo de Git tan grande, especialmente en lugares geográficamente distribuidos, fue una pesadilla. Git tampoco tiene una función de clonación parcial, algo que hacemos en SVN todo el tiempo; solo busca una carpeta en particular. Hay un pago parcial en git, pero aún tienes que clonar el repositorio completo.

Tenga en cuenta que si es o no es un archivo binario no afecta a la cantidad de espacio repositorio utilizado para almacenar cambia a ese archivo, ni afecta a la cantidad de tráfico entre el cliente y el servidor de . Para propósitos de almacenamiento y transmisión , Subversion usa un método diferente que funciona igual de bien en los archivos binarios y de texto ; esto es completamente sin relación con el método de diferencia usado por el comando 'svn diff'.

http://subversion.apache.org/faq.html#binary-files

Dadas maduros herramientas de Administrador del Sistema de SVN (Git también ha mejorado con los años, pero me siento SVN todavía tiene la ventaja en este aspecto) Creo que va a ser prudente tener un servidor SVN con probablemente git-svn repo para el desarrollo local.

Hay algo llamado git-bigfiles, que es una bifurcación de git. No estoy seguro de qué tan maduro es. Usted puede evaluarlo. Pero el hecho de que exista, muestra que Git no es necesariamente bueno en el manejo de archivos de gran tamaño.

+1

En primer lugar, las cremalleras ya están comprimidas, por lo que la compresión gzip git se aplica, por supuesto, no va a funcionar tanto. En segundo lugar, no necesariamente tiene que clonar un repositorio. De hecho, la clonación es algo que solo hace al principio para configurar su repositorio local. Sin embargo, puede simplemente agregar otros repositorios como controles remotos y hacer búsquedas parciales de ramas, etc. – poke

+0

Independientemente de eso, a menos que tenga cambios constantes en los archivos binarios (por ejemplo, cuando su editor usa un formato binario, por ejemplo, los archivos .fla de Flash IDE) , usar Git para almacenar activos binarios * (sonidos, imágenes) no es un problema en absoluto, y especialmente los pequeños inconvenientes no excederán los beneficios que se obtienen al usar Git en primer lugar. – poke

+1

No creo que entiendas mi preocupación por la clonación. Cuando tengo que configurar un repositorio local nuevo, tengo que clonar, independientemente de que un clon sea un trabajo de una sola vez. Y buscar una rama en particular todavía no es parcial desde el mundo SVN de las cosas. Y en cualquier proyecto de proyecto grande, los archivos binarios van a cambiar con mucha frecuencia. Incluyendo los activos. Al menos un subconjunto de ellos, que es suficiente para comenzar a dar los problemas. – manojlds

0

Otras respuestas han abordado las opciones aquí, pero también existe la posibilidad de usar SVN para los archivos binarios (si cambian mucho) y git para todo lo demás. Durante la fase de compilación, puede usar scripts para buscar el recurso binario desde svn.