2010-07-22 9 views
24

Recientemente he tenido que escribir git hooks, para todos los commits para hacer referencia a un ticket en particular.Escribiendo ganchos Git en scripts python/bash

Estaba esperando un lugar para comenzar a aprender. Todas las cosas en el libro de profesionales están escritas en Ruby. Como Ruby no es mi fuerte, ¿alguien puede compartir tutoriales sobre git hooks escritos en otros idiomas? (Preferiría especialmente las secuencias de comandos de Python o Bash)

+3

redactado correctamente, esto puede ser una buena pregunta general , así que he reformulado esto para que sea más general y menos específico de idioma (respetando al mismo tiempo la experiencia del interrogador en python y bash). Si alguien quiere ayudar a limpiarlo más, de modo que sea lo suficientemente general como para vincularlo al GIT no oficial. Preguntas frecuentes http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide, que sería muy apreciado. –

+1

Gracias. Lo aprecio, Ken – myusuf3

Respuesta

16

Here es un ejemplo del uso de Python para un enlace. En general, los ganchos son independientes del idioma. Utiliza la secuencia de comandos para hacer algún trabajo o para salir con un 0/otro código de retorno para alterar el flujo de un proceso de git.

7

Los ejemplos que vienen con git están escritos en script de shell; hay algunos básicos en .git/hooks de cada repositorio y los más avanzados instalados en /usr/share/doc/git-core/contrib/hooks.

También hay más información sobre los diversos ganchos disponibles a través de $ man githooks.

5

Descubrí que es fácil escribir git hook en python. Es un ejemplo de gancho post-recepción en Python. ejemplo proporcionado despliega maestro y desarrollar sucursales en diferentes carpetas (cambios en el maestro serán empujados a la página web de producción y los cambios en el desarrollo de la rama serán empujados al sitio QA)

#!/usr/bin/env python                  
# -*- coding: UTF-8 -*-                 
#post-receive                    

import sys                    
import subprocess                   

# 1. Read STDIN (Format: "from_commit to_commit branch_name")        
(old, new, branch) = sys.stdin.read().split()            

# 2. Only deploy if master branch was pushed            
if branch == 'refs/heads/master':               
    subprocess.call('date >> ~/prod-deployment.log', shell=True)       
    subprocess.call('GIT_WORK_TREE=/home/ft/app.prod git checkout master -f', shell=True) 
    subprocess.call('cd ../../app.prod;bower update', shell=True)       

#3. Only deploy if develop branch was pushed            
if branch == 'refs/heads/develop':              
    subprocess.call('date >> ~/dev-deployment.log', shell=True)       
    subprocess.call('GIT_WORK_TREE=/home/ft/app.dev git checkout develop -f', shell=True) 
    subprocess.call('cd ../../app.dev;bower update', shell=True)       
+0

La variable que denominó 'branch' es en realidad la referencia remota (así que me gusta usar' remote_ref'). Esto significa que las condiciones para los n. ° 2 y n. ° 3 realmente no controlan lo que dicen estar comprobando. Por ejemplo, con el comando 'git push origin develop: master' la 2da condición cree que estás presionando la rama master pero no estás - está presionando * a * master, pero no presionando * desde * master. Las condiciones en el ejemplo asumen que solo se envía el maestro local al maestro remoto y de manera similar para otras ramas con nombre. – Dennis

+0

También tenga en cuenta que 'old' es la referencia local y' new' es el SHA-1 de la confirmación local. Aquí está la línea completa que se proporciona a través de STDIN al gancho: '' – Dennis

+0

@Dennis lo siento, no entiendo su comentario. git push origen desarrollar: maestro empuja local.develop a origin.master. Ok, pero empujas hacia el master no importa desde master o desde otro brunch. Intento entender que no entendí bien tu pregunta o que no tienes idea de la solución –