2010-08-08 35 views
17

Estoy usando git para el control de fuente y envío mis cambios a un repositorio en un servidor en Internet para mantenerlos a salvo.¿Qué tan seguro es "git" con una conexión no confiable?

Puedo hacer algunas pequeñas cantidades de codificación en una computadora portátil en un tren, que tiene una conexión a internet wifi pero no es que confiable y ocasionalmente se cae o se vuelve inutilizable lento. Mi pregunta es ¿qué sucede si mi conexión se pierde durante un "git push"? ¿Voy a terminar con un repositorio git corrupto o medio actualizado? Y si es así, ¿qué tan difícil es recuperarlo?

+0

Me imagino que es como SVN y es una transacción ... por lo que si la actualización falla, nada en el repositorio cambia. No sé lo suficiente sobre eso para una respuesta correcta – WalterJ89

+0

Espero que también, pero me gustaría saber con certeza :) – jcoder

Respuesta

15

Git no dañará o "actualizará a la mitad" su repositorio de Git solo por una conexión fallida o lenta. Es muy robusto y aún me sentiría cómodo usándolo incluso en las circunstancias más difíciles.

La función real push se implementa en esencialmente dos pasos (en el caso de un empuje de avance rápido, que debe ser siempre el caso):

  • carga todos los objetos accesible desde la cabeza rama actual y no accesible desde la cabeza de la rama remota
  • actualización de la cabeza rama remota para que apunte a la última cometer

la primera operación es idempotente, por lo que si falla por cualquier razón a medio camino, simplemente puede ejecutar de nuevo para poner todo al día. La segunda operación es atómica y solo ocurre una vez que se cargan todos los objetos nuevos.

+0

Si falla la inserción durante una actualización grande en el primer paso (debido a la pérdida de conexión), ¿retoma git donde lo dejó cuando la conexión se recupera, o comienza de nuevo? –

+0

@Mark Elliot: los objetos pueden transferirse individualmente o en "paquetes". No creo que un archivo de paquete incompleto se almacene en el destino si la conexión falla, pero los objetos individuales probablemente sí lo estén. –

+0

@Mark Elliot: comenzará de nuevo, git usa los refs (actualizados en el segundo paso) para determinar lo que debe enviar. Consulte Documentation/technical/send-pack-pipeline.txt para obtener más información. – CesarB

5

Según Linus git está tan bien protegido en el área de datos que incluso detectaría un error de memoria en el sistema en el que se está ejecutando. Simplemente no aplicará los paquetes que llegan al servidor que tienen una suma de comprobación no válida, por lo que no tiene nada de qué preocuparse.

+0

Si tengo varios cambios locales para presionar, puedo estar seguro de que no se aplicarán algunos de ellos, pero no ¿otros? – jcoder

Cuestiones relacionadas