2011-11-14 13 views
48

Estoy tratando de escribir una secuencia de comandos de tela que hace un git commit; sin embargo, si no hay nada que confirmar, git sale con un estado de 1. La secuencia de comandos de implementación lo toma como no exitoso y se cierra. Quiero detectar real fallas de compromiso, por lo que no puedo simplemente dar a la tela una manta ignorar por git commit fallas. ¿Cómo puedo permitir que las fallas de commit vacío se ignoren para que la implementación pueda continuar, pero aún detectar los errores causados ​​cuando falla una confirmación real?¿Cómo git no cometer nada sin un error?

def commit(): 
    local("git add -p && git commit") 

Respuesta

69

¿Adivina esta condición de antemano marcando el código de salida de git diff?

Por ejemplo (con cáscara):

git add -A 
git diff-index --quiet HEAD || git commit -m 'bla' 

EDIT: fijo git diff comando de acuerdo con el comentario de Holger.

+47

Tenga en cuenta que 'git diff' es un comando de" porcelana "que no debe usarse para scripts. Lo que probablemente desee es 'git diff-index --quiet HEAD || git commit -m 'bla''. Ver también [esta respuesta] (http://stackoverflow.com/a/2659808/659002). – Holger

+0

Para explicar las cosas más, el problema con 'git diff --quiet --exit-code --cached' es que se evaluará a' 1' (falso) solo para los archivos modificados que no se han configurado para la confirmación (archivos no agregados)) El comentario votado es la mejor solución para dar cuenta de nuevos archivos y eliminaciones. –

+0

El comentario sobre 'git diff-index --quiet HEAD || git commit -m 'bla'' debería ser una respuesta en esta pregunta. –

41

Desde la página git commit hombre:

--allow-empty 
    Usually recording a commit that has the exact same tree as its 
    sole parent commit is a mistake, and the command prevents you 
    from making such a commit. This option bypassesthe safety, and 
    is primarily for use by foreign SCM interface scripts. 
+26

Esto realmente crearía una confirmación. – ThiefMaster

+5

@ThiefMaster: Correcto. No puedo decir desde el OP si esto es un problema o no. Supongo que si está utilizando confirmaciones automáticas, no le importa que su historia esté limpia de todos modos. –

+1

Preferiría que no se comprometa si se puede evitar. ¿Hay una manera de hacer eso? – kojiro

6
with settings(warn_only=True): 
    run('git commit ...') 

Esto hace que la tela de ignorar el fallo. Tiene la ventaja de no crear commits vacíos.

Puede envolverlo en una capa adicional de with hide('warnings'): para suprimir por completo la salida, de lo contrario, obtendrá una nota en el resultado de la tela que falló la confirmación (pero el archivo fab continúa ejecutándose).

+0

OP escribió" Yo quiero detectar * real * fallas de compromiso "; este código ocultará * todas * fallas para comprometer. – bfontaine

-3

try/catch baby!

from fabric.api import local 
from fabric.colors import green 


def commit(message='updates'): 
    try: 
     local('git add .') 
     local('git commit -m "' + message + '"') 
     local('git push') 
     print(green('Committed and pushed to git.', bold=False)) 
    except: 
     print(green('Done committing, likely nothing new to commit.', bold=False)) 
+6

Para explicar por qué se da downvoted: puede haber otros errores que desee atrapar. No querrás simplemente asumir que en caso de error, es posible que no se haya cometido nada.- Además, pero eso no está relacionado: nunca utilice un 'excepto :: genérico, use' excepto la excepción' más o menos. – Albert