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
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í.
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
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.
¿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
De acuerdo, en su lugar cambiaré al gancho 'update'. Gracias por la sugerencia de Jonas. – Jeebs24
- 1. Git deshacer última confirmación
- 2. ¿Cómo obtener SHA de la última confirmación desde el repositorio remoto de git?
- 3. Git: ver mi última confirmación
- 4. Git: cómo retroceder a la última inserción/confirmación
- 5. Buscar la última confirmación en el repositorio Git que contiene un determinado patrón de cadena
- 6. Usando git para obtener la última revisión
- 7. ¿Cómo puedo comprometer la última confirmación en un repositorio de git bare?
- 8. ¿Puedo eliminar la confirmación inicial de un repositorio de Git?
- 9. Git revertir última confirmación y sacarlo de la historia
- 10. ¿Cómo puedo eliminar mi última confirmación en mi repositorio local de git
- 11. Cómo eliminar la última n confirmación en Github y localmente?
- 12. Repositorio de Git dentro del repositorio de Git
- 13. obtener mensaje de confirmación en git hook
- 14. ¿Cómo obtener la última fecha de compromiso para un grupo de archivos en Git?
- 15. ¿Cómo revertir un puntero del submódulo de Git a la confirmación almacenada en el repositorio contenedor?
- 16. Cómo obtener etiquetas en la confirmación actual
- 17. ¿Cómo volver a la última confirmación después de verificar una confirmación anterior?
- 18. ¿Cómo ves qué confirmación eliminó un archivo del repositorio?
- 19. Git: extracción automática del repositorio?
- 20. División de la primera confirmación en git
- 21. git: mejor forma de revertir git sin confirmación revertida adicional
- 22. Convertir la codificación del archivo del repositorio git
- 23. Usando xcode, ¿cómo puedo distinguir entre una copia de trabajo de un archivo y la última confirmación en el repositorio?
- 24. Quitar del repositorio git (historia)
- 25. git - eliminar archivo del repositorio
- 26. ¿Hay alguna forma de deshacer mi última inserción en Git?
- 27. calabaza git y preservar de la última confirmación de marca de tiempo
- 28. Git: Cómo obtener una instantánea de un repositorio git
- 29. Obtiene la última etiqueta de git de un repositorio remoto sin clonar
- 30. Cambiar la ubicación del directorio del repositorio de Git.
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
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)). –