2011-03-08 14 views
14

¿Cómo gestiona los ganchos de commit de git pre/post en varias plataformas (por ejemplo, * nix y windows)?Ganchos de git multiplataforma

¿Alguna de las mejores prácticas recomendadas para este escenario?

Respuesta

10

Los ganchos de git no son realmente diferentes de cualquier script de shell, ya que las mejores prácticas para mantenerlos "multiplataforma" se aplican de la misma manera. La menor diferencia es que también puede estar apuntando a las capas de emulación de Windows * nix como los principales usuarios de estos ganchos, y estos pueden quedar comparativamente paralizados en comparación con la mayoría de los entornos de Unix reales.

Acabo de portar un enganche post-commit (y escribí un enganche previo a la confirmación) para el Git predeterminado para Windows, que usa MINGW32. Algunos de los cambios que tenía que hacer ya que la versión anterior hizo algunas suposiciones sobre el entorno de programación disponibles:

  • sin readlink disponibles, pero era ineficaz en Windows de todos modos, por lo que sólo hackeado en un cheque de which readlink y sin desa- si no había ninguno
  • redireccionamiento a /dev/null no funciona en Windows, en lugar usted tiene que redirigir a nul, para hacer esto que acabo de hacer una comprobación uname -s y establecer una variable para lo redirigir a
  • sin mktemp disponible, pero dado que era un directorio que terminamos podando de todos modos, utilizamos un nombre de directorio ingenuamente modificable
  • por alguna razón, redireccionamiento de la salida estándar a través de exec >>$out funciona bien en mingw32, pero exec 2>>$err para STDERR no (se parece a morir en silencio), así que por desgracia sólo tenía que evitar que la redirección

Aparte de eso, funcionó bastante bien como está, porque no había muchas "cosas" específicas de la plataforma. Así que solo adhiérase a las mejores prácticas para hacer scripts multiplataformas y eso debería brindarle al menos el 80% del camino hasta allí. Después de eso, prueba la prueba de prueba en todos los diversos entornos a los que te diriges.

+4

Por supuesto, no es necesario que un git hook sea un script de shell; de hecho, hay al menos uno en el directorio contrib de git en Perl. – Cascabel

+0

@Jefromi buen punto, aunque la etiqueta [shell] me lleva a creer que lo está haciendo en el script de shell, pero tal vez no sabe que tiene que hacerlo así +1 –