2012-06-22 19 views
8

Tengo un repositorio central de Git descubierto. Cuando se hace un push para ese repositorio, quiero ejecutar un gancho post-recepción. Lo que hará ese gancho es crear un mensaje en un proyecto de Basecamp (usando su API). Quiero información sobre la actualización que acaba de realizarse. En este momento creo que git log -2 --stat es lo suficientemente bueno, pero me gustaría un poco más de información (rama que se actualizó, archivo creado, archivos eliminados). ¿Alguien puede ayudarme con los comandos que necesito para obtener toda la información? La ejecución de múltiples comandos está bien conmigo, probablemente no haya un solo comando que me proporcione toda la información.Obtener la última confirmación del repositorio de Git

Respuesta

3

Se puede encontrar las últimas cometen mediante el examen y clasificación de los archivos bajo .git/refs/heads: cada vez que un nuevo commit se hace, se cambia el archivo refs/heads correspondiente, es decir, cuando comprometerse a master, refs/heads/master se actualiza.

Entonces, desarrollemos una solución.

primera tarea: encontrar todas las ramas (es decir, todos los archivos bajo refs/heads e imprimir cuando se cambiaron última Estamos hablando de ganchos, por lo que dan la ruta relativa al directorio .git/hooks:.

find ../refs/heads -type f -printf '%[email protected] %p\n' 

Esto produce una lista de todas las ramas, junto con su fecha de cambio Ver la man page of find para una explicación de los parámetros

Segunda Prueba:.. Ordenar la lista obtenida

find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
sort 

Tercera Prueba: necesitamos el elemento más nuevo en esa lista. Dado que sort clasifica de antiguo a nuevo, nuestro elemento deseado se encuentra en la parte inferior de la lista. Obtener este elemento con tail (sólo un artículo, por lo tanto, pasar el indicador -1):

find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
sort |\ 
tail -1 

Cuarta tarea: colocar la fecha en la línea obtenida. De nuestra declaración printf sabemos que la fecha y la ruta están separadas por un espacio. Alimente esto como delimitador en cut (-d " ") y dígale que necesitamos el segundo campo (es decir, la ruta del archivo, -f 2). Para mayor comodidad, almacenaremos esta ruta de archivo en una variable llamada $LATESTHEAD:

LATESTHEAD=$(\ 
    find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
    sort |\ 
    tail -1 |\ 
    cut -d ' ' -f 2) 

Quinta tarea: Ahora sabemos el nombre del archivo, pero necesitamos el contenido. Esta es la última revisión que se puede pasar al git log. cat hace el trabajo. Almacenar la última revisión en $LATESTREV

LATESTHEAD=$(\ 
    find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
    sort |\ 
    tail -1 |\ 
    cut -d ' ' -f 2) 
LATESTREV=$(cat $LATESTHEAD) 

Ahora, usted podría utilizar $LATESTREV hacer cualquier cosas sucias que desee.

Quizás no sea la solución más elegante (probablemente alguien aparecerá y te dirá que es mucho más fácil) pero funciona para mí.

+0

Esto realmente funciona para bien también. También necesito el nombre de la sucursal, así que supongo que tengo que ejecutar la ** Tercera tarea ** primero en el nombre de la sucursal. Después de eso, ejecuto la ** Quinta tarea ** para obtener el hash de confirmación. Después de eso, ejecuto 'git log --stat -1 ' para obtener la información de confirmación completa. Es extraño, tengo que agregar '-1'. Yo no me da todo ... extraño. De todos modos, parece que funciona! Gracias eckes! – Jeebs24

+0

Perdón por promocionar mi respuesta, pero no veo por qué está usando find aquí si toda la información está dada en stdin por git al llamar a post-receive (vea [githooks (5)] (https: //www.kernel. org/pub/software/scm/git/docs/githooks.html # post-receive)). –

2

Adición --summary a su git log producirá el archivo de nuevo y borrar lista (GIT se refiere a ellos como "nodos"):

git log --stat --summary -1 

para obtener la rama, intente ejecutar:

git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3- 

Nota: Estoy probando esto en mi mac. Unix cut está indexado, pero creo que Debian cut tiene 0 indexados. Si es así, y si usted está en un cuadro de Debian, cambiar -f1--f0 y el comando rama debería funcionar bien

1

Si no hay ninguna razón específica por la cual se utiliza post-receive, prefiero sugerir el uso de update, que consigue el viejo ref, la nueva referencia y la ramificación como argumentos de línea de comando.

Por lo que sólo puede obtener todo el registro usando los comandos git log sugeridas aquí y dando oldref..newref como argumento (en sustitución de oldref y newref respectivamente).

Para obtener más información, consulte el githooks(5) manpage on the update hook. Incluso puede cancelar la actualización en ese punto si es necesario.

En realidad, obtienes la misma información en el gancho post-receive de stdin. No veo por qué necesita hacer muchos comandos find para realizar esa tarea.

+0

¿Cómo obtengo la información de 'oldref' y' newref'? Soy bastante nuevo con Git y ganchos. Conseguí mi repo de Git conectado con mi Basecamp y funciona como un encanto. Pero si hay una mejor manera y puedo obtener más información, incluso mejor. Voy a seguir adelante y leer en la página de githooks (5), pero si puedes dar una igual, te agradecería mucho. – Jeebs24

+0

De acuerdo, en su lugar cambiaré al gancho 'update'. Gracias por la sugerencia de Jonas. – Jeebs24

Cuestiones relacionadas