Actualización de Svn vs Git Pull – detalles de implementación

¿Cómo se realiza realmente svn up? ¿Obtiene diffs del server y aplica em, o el server solo envía la última versión de un file (¿está comprimido?) Que luego se fusionó con mi file local?

Lo pregunto porque afaik, en git cada revisión de file es un blob, así que espero que cuando ejecuto git pull obtenga blobs del server y no diffs.

Y la verdadera pregunta es ¿qué es teóricamente más rápido svn up o git pull? (por supuesto, depende del tamaño del repository y de los cambios en el repository, pero consideremos solo el tráfico de la networking)

Gracias por adelantado

svn up determina la revisión base del file en su copy de trabajo y lo comunica al server. El server usará ese conocimiento para calcular una versión del file para devolver. El delta luego se aplica para get la nueva base de trabajo, y el diff también se aplica a su copy de trabajo.

Hay algo más que está pasando aquí, y algunas optimizaciones en ciertas circunstancias, pero en su nivel más básico esto es lo que está sucediendo. Es un poco complicado porque Subversion admite copys de trabajo de revisión mixta. Eso es copys de trabajo que tienen diferentes partes del tree en diferentes revisiones.

git pull es un poco diferente. Dado que git no admite copys de trabajo de revisión mixtas, realmente solo le importa en qué comprometerse actualmente. Entonces, git comunicará el estado actual de sus references (sucursales) y luego el server calculará qué confirmaciones deben enviarse, empaquetarlas y enviarlas al cliente. Una vez que las confirmaciones nuevas están en el cliente, se actualiza la reference remota y se intenta fusionar los nuevos contenidos con la copy de trabajo.

Desde una vista de alto nivel, creo que los dos son terriblemente similares: computan "diffs", los comprimen y los envían al cliente. Pero los detalles difieren dramáticamente. El contenido del file completo no necesariamente se envía con ninguno.

Creo que git pull es un poco más eficiente en la networking por algunas razones:

  1. Git solo necesita comunicar el SHA1 de las twigs, mientras que Subversion necesita rastrear todo el tree que se está actualizando y comunicar partes del tree que son revisiones diferentes a la base del tree de trabajo (que es común es Subversion). Este último bit también significa que también hay más E / S de disco, aunque se ha mejorado mucho en las versiones más recientes de Subversion.

  2. Git generalmente hace un mejor trabajo al alinear contenido similar, lo que significa que generalmente logra una mejor compression de los datos.

  3. Git rastrea y comunica el contenido mejor. Entonces, si tiene tres copys de un file en Git, solo comunicará una burbuja para representar ese file, mientras que Subversion comunicaría tres.

OTOH, puedes elegir actualizar solo una parte del tree en Subversion. Si tienes muchos desarrolladores trabajando en la base de código con mucha actividad en el repository, y tu parte está bastante aislada, entonces podrías svn up solo en el tree que te interesa y no tener que preocuparte de agarrar los otros bits hasta que estés listo . Git solo funciona en el repository y no es compatible con copys de trabajo de revisión mixtas, por lo que querrá get todas las confirmaciones, lo que podría suponer una gran cantidad de datos.

Entonces, al final, probablemente dependa de su caso de uso y de lo que sea importante para usted. Pero, en general, creo que Git tiene la sartén por el mango.

Git almacena blobs, pero comunica diffs. Git es muy eficiente al hacer esto. La obtención de cambios del server git primero determina las diferencias entre el server y el cliente y comunica un package. El package es un tipo de diferencia comprimida entre fetching git y server git. También maneja grandes files binarys muy eficientes.