2012-05-07 12 views
13
  • ¿Qué señales son seguras, cuáles no?¿Qué señales se pueden usar con seguridad para matar un proceso de Git y cuáles no?

  • Para aquellas señales que no son seguras, ¿qué daño podría causar al matar un proceso de Git? ¿Podría el árbol de trabajo quedar en un estado indefinido? ¿Se podría dañar .git/index o incluso la base de datos .git/objects?

  • ¿Los archivos están escritos en algún tipo de operación "atómica" por Git? (Trabajando archivos del árbol, .git/índice, los archivos de configuración, y así sucesivamente ...)

Actualización: pregunta más precisa sobre las señales

+0

Puede ser más preciso. ¿Qué señal exactamente enviarías el proceso de git para detenerlo? Estoy seguro de que un SIGINT está bien (al igual que^C en la línea de comandos), pero tal vez no un SIGKILL o SIGSEGV. – Artefact2

+0

@ Artefact2: Gracias, formulé una pregunta más precisa con respecto a las señales. – mstrap

+0

(Casi) un duplicado de: http://stackoverflow.com/questions/8384101/can-a-git-repository-be-corrupted-if-a-command-modifying-it-crashes-or-is-aborte – sleske

Respuesta

2

En realidad, git intenta bastante difícil ser totalmente transaccional - es decir, se trata de Nunca dejar el repositorio en un estado incoherente, no importa cuándo o cómo se interrumpe una operación - ver esta pregunta: Can a git repository be corrupted if a command modifying it crashes or is aborted?

Por lo tanto, no debería importar cómo se finaliza el proceso de git, si se usa SIGTERM, SIGKILL o el botón de encendido rojo. La excepción, como se señala en la respuesta anterior, es que los archivos en el directorio de trabajo pueden ser una mezcla de archivos de diferentes ramas, porque los archivos no se pueden reemplazar todos a la vez.

Dicho esto, la seguridad de las transacciones es difícil de probar (ya que hay muchos casos de esquina), así que no confiaría 100% en que git sea seguro en esta situación. Normalmente debería estar bien, pero podría golpear un error de vez en cuando y estropear el repositorio.

+0

Entonces, ¿qué está diciendo es que Git está diseñado de manera que el repositorio sea completamente transaccional y el árbol de trabajo casi (excepto en la excepción mencionada), suponiendo que la implementación está libre de errores? – mstrap

+0

@mstrap: Sí (en realidad, no soy yo quien lo dice sino Jan Hudec, quien escribió la respuesta vinculada). – sleske

2

Eso depende de lo que está haciendo GIT cuando intenta matarlo

Si lo mata durante un clon, asegúrese de que quede parcialmente incompleto, pero es fácil recuperarse de eso: elimine el clon parcial desordenado y vuelva a clonar.

En mi experiencia, GIT no mata los archivos que está administrando cuando falla. Lo he matado en medio de empujones antes sin mucho daño a los archivos que cambié. De acuerdo, el registro de mensajes puede ponerse un poco complicado.

Sin muchos más detalles que lo que ha proporcionado, es difícil de decir.

+0

¿Qué detalles necesitas? – mstrap

+0

@mstrap ¿Cuándo matas a GIT? Durante los commits, empuja, tira, rebases? ¿O simplemente te preguntas qué pasará en general? – kevin628

+0

@ kevin268 Planeo matar a Git durante cualquier operación, desde una interfaz de usuario, a petición del usuario (por ejemplo, al cerrar una ventana). ¿Debo permitir hacer eso? – mstrap

Cuestiones relacionadas