2010-04-03 26 views
7

Cuando se habilita antes de recibir gancho para git repositorio:Git pre-recepción gancho

Se toma ningún argumento, pero para cada árbitro será actualizada que recibe en la entrada estándar una línea del formato:

< pasada de valor> SP < nuevo valor> SP < ref-name> LF

donde < pasada de valor> es el antiguo nombre de objeto almacenado en el árbitro, < nuevo valor> es el nuevo nombre del objeto para ser almacenado en la ref y es el nombre completo e de la ref. Al crear una nueva ref, < pasada de valor> es 40 0.

¿Alguien me puede explicar cómo lo examino todos los archivos que se van a cambiar en el repositorio si permito que este cometido?

Me gustaría ejecutar esos archivos a través de algunos scripts para verificar la sintaxis, etc.

Gracias.

Respuesta

18

Curiosamente, tenía algún código por git -> utilidad Wordpress que podría ayudar. Lo siguiente le dará una lista de todos los archivos modificados en la recepción, así como su contenido. Sin garantías, puede tener errores, puede que no sea la forma más eficiente de hacerlo, bla, bla, bla. Parte de este código se basa en gitshelve, lo cual es realmente una gran cosa a tener en cuenta para la maniuplación git genérica.

+0

Gracias por este código, ¡esto ayudó mucho! Hice un pequeño ajuste a 'get_changed_files', así que usa' --name-only', lo que hace que el análisis del resultado sea más fácil: https://gist.github.com/1055516 – keegan3d

1

Si usted quiere saber si el permisos de los archivos se ha cambiado en el repositorio local antes de empujar al repositorio remoto, corren git ls-tree -r commit, donde se comprometan el SHA cometer valor del repositorio local.

Este comando proporciona una lista de archivos con sus permisos, que se pueden analizar para verificar si se modifica el permiso de un archivo antes de presionar.

9

Acabo de hacer esto. Aquí está el flujo básico que utilicé.

En su pre-recibir gancho, leer cada línea de la entrada estándar, que (como usted ha mencionado) tener este aspecto:

oldref newref refname 
  1. Para cada (oldref, newref) par que necesita para una lista de todos los compromete:

    git show --format=format:%H --quiet oldref..newref 
    
  2. para cada comprometen necesita para listar todos los archivos:

    git diff --name-only commit^..commit 
    
  3. para examinar un archivo, usa git show:

    git show commit:filepath 
    

    hacer lo que la comprobación del contenido del archivo aquí.Si desea notificar al usuario de un tema, escribir en stderr

  4. después de la iteración de todos los árbitros, compromete y archivos de salida distinto de cero para rechazar el empuje, o cero para permitir que

Tenga en cuenta que este el enfoque realiza todos los commits en orden, por lo que si se modifica un archivo en varias confirmaciones, se examinará cada versión. Si solo desea ver cada archivo con un solo clic, recorra los commits en el orden inverso, y simplemente no examine un archivo determinado dos veces. Sin embargo, recomiendo el primer enfoque para que se examinen todas las versiones de archivos comprimidos.

+0

De alguna manera, no pude deshacerme de la diferencia en 'git show --format = format:% H --quiet oldref..newref'. Tal vez porque agregué nuevos archivos en el repositorio y el diff estaba en contra de/dev/null: D. Creo que 'git log --format =% H oldref newref' debería hacer lo mismo y no hay diferencia :) –

Cuestiones relacionadas