2010-05-14 14 views
5

A veces, alguien de nuestro equipo hace un git push y rompe la compilación porque su compilación local funciona pero se ha olvidado de enviar todas sus modificaciones locales y archivos sin seguimiento a git antes de que empuje.¿Cómo puedo evitar git push si se detectan modificaciones locales (incluidos los archivos sin seguimiento)?

me gustaría evitar esto ... Serví en los documentos de una hora o así hoy y no pude encontrar nada incorporado.

¿Alguien tiene alguna solución?

+5

Dile a tus desarrolladores que tengas más cuidado? Las herramientas no siempre son la solución. –

+2

Dale un poco de color al repositorio git y enséñales a tus desarrolladores sobre "git add". "git status" y "git add -A" –

Respuesta

5

Puede usar el gancho pre-push (desde git 1.8.2).

Su gancho pre-push podría verificar el código de salida git status, devolviendo 0 (Aceptar para presionar) si git status devuelve un valor distinto de cero, de lo contrario devolverá 1 (no permita la inserción).

La página del manual para git-status dice:

Si no hay un camino que es diferente entre el archivo de índice y HEAD y comprometerse (es decir, no hay nada para cometer ejecutando git commit), las salidas de comando con un estado distinto de cero.

Cualquier cesión temporal creada con Git 1.8.2 o posterior tendrá pre-push.sample en el directorio .git/hooks, que es un punto de partida útil para la implementación de su política. Hay más ejemplos buenos de usar el gancho pre-push aquí: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/

Tenga en cuenta que el gancho no se ejecuta en el repositorio ascendente. Cada clon necesitaría tener este gancho instalado para hacer cumplir su política. (Los ganchos no se clonan como parte del repositorio. Como git ejecuta los ganchos, este diseño evita que se ejecuten ganchos maliciosos en el equipo del desarrollador. El código malicioso debe ir a un script Makefile o configure, que los desarrolladores ejecutan sin mirar)

+0

¿No es este el gancho 'pre-push'? – Glyph

+0

@Glyph - gracias! 'pre-push' se agregó en git 1.8.2, por lo que mi respuesta está desactualizada. Para cualquier persona interesada, hay alguna buena información aquí: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/ –

0

Puede usar el various hooks (pre-receive, creo) para determinar si el empuje romperá la construcción y la rechazará. Además de eso, debe decirle a los desarrolladores que ejecuten git status antes de cualquier operación de confirmación o inserción, que es una regla increíblemente sensata que debe implementarse y que evitaría dichos problemas.

0

Para agregar cambios automáticamente, es posible que desee considerar el uso del indicador -a. Desde el git-commit man page:

Dile a la orden de forma automática los archivos de stage que han sido modificados y eliminados, pero los nuevos archivos que ha contado no git por no se ven afectados.

No parece haber ningún indicador para git commit que agregue archivos sin seguimiento. Recordar hacer un git add . antes del commit es la mejor solución que puedo pensar.

+0

Recuerda eso "git add". solo agrega archivos que están debajo o en el mismo nivel que se ejecuta el comando –

0

¿Tal vez ponga un alias, ya sea en su configuración de shell o git, que reemplace el comando push predeterminado con un script personalizado que primero tiene el estado de git y busca "limpiar el directorio de trabajo"? No sé si es posible sobreescribir la inserción, o si lo haría para que no pueda llamar al real. Solo una idea fuera de mi cabeza, así que no tengo idea de si realmente funciona.

+0

No puede usar un alias para anular un comando incorporado . Un alias de shell no puede contener un espacio, por lo que vuelve a escribir su propio comando. – Cascabel

0

Terminé agregando un objetivo ant a nuestra construcción local antes de empujar a nuestro repositorio principal ... aquí está el objetivo ...en caso de que alguien más esté buscando un paso en la dirección correcta.

Gracias a todos los que respondieron.

<target name="git-status-check"> 
    <echo>Performing git working directory check for local modifications or untracked files.</echo> 
    <exec executable="git" failifexecutionfails="true" 
     outputproperty="git.check"> 
     <arg value="status"/> 
    </exec> 
    <echo>${git.check}</echo> 
    <propertyregex property="dirty.working.dir" input="${git.check}" regexp="working directory clean" 
     select="\1" casesensitive="false" /> 
    <fail message="Git status reports that you have local modifications or untracked changes in your working dir... did you forget to commit these changes? ${line.separator} "> 
     <condition> 
      <not> 
       <isset property="dirty.working.dir" /> 
      </not> 
     </condition> 
    </fail> 
    <echo>Git status reported a clean working dir continuing build...</echo> 
</target> 
+0

¿Mi respuesta te ayudó/respondió tu pregunta? –

+0

debes aceptar la respuesta de Matt ... esto no es particularmente útil considerando la pregunta (vino de google y el comentario de Matt fue increíblemente útil) –

+0

Lo hice ... hace 6 años – Clintm

Cuestiones relacionadas