¿Cómo se muestran las confirmaciones de Git que se publicaron en less de 60 segundos entre ellas?

Quiero mostrar un historial filtrado de confirmaciones. Solo necesito esos commits que tienen less de 60 segundos entre ellos, para ver quién cometió un error cometiendo tan rápido. ¿Como hacer esto?

Tendrá que analizar la salida de git-log usted mismo; no hay una forma incorporada de hacer eso. Lo complicado es tratar apropiadamente con fusiones. Si tuvieras un historial lineal, sería muy rápido: usa la salida de git log --pretty="$H $at" directamente (eso es imprimir hash completo y UNIX timestamp). Sin embargo, una vez que se fusiona, no hay forma de que siempre termine con cada confirmación seguida inmediatamente por la que desea comparar.

El enfoque obvio es search el time principal para cada confirmación individualmente. Por supuesto, es bastante ineficiente hacer una llamada adicional a Git Log para cada commit en lugar de recordarlos de forma inteligente, pero el código seguro es más corto. Esto es lo que se me ocurrió como un bash de un trazador de líneas:

 git log --no-merges --pretty="%H %at" | while read line; do time=${line#* } commit=${line% *} parent_time=$(git log --no-walk --pretty=%at $commit^) dt=$((time - parent_time)) if [ $dt -lt 60 -a $dt -gt -60 ]; then # modify this log format to whatever you like git log --no-walk --pretty="%H %an %s" $commit fi done 

No es tan terriblemente lento, así que si no quieres hacer esto tanto, probablemente sea lo suficientemente bueno. También solo tiene que verificar todo el path hasta el comienzo del repository una vez; después de eso puedes limitar el logging de git inicial con un --since .

Notarás que limité la diferencia en el time entre + -60 segundos. Es bastante posible que sea negativo si hubo una rebase; es probable que aún desee darse count si alguien hizo dos commits rápidamente y luego los cambió, así que incluí los valores negativos.

para ver quién cometió un mal trabajo cometiendo tan rápido

Hay razones muy válidas para realizar dos confirmaciones por separado en un intervalo muy corto.

Supongamos que ha estado trabajando durante dos horas, ha realizado dos correcciones de errores, cambia al file A corrige el error #a, y cambia al file B corrige el error #b.

 git add A git commit -m"fixed bug #a" git add B git commit -m"fixed bug #b" 

la diferencia entre estos commits puede ser de 10 segundos, pero no hay nada de malo en ellos.

De hecho, la mayoría de las personas estarán de acuerdo en que lo incorrecto es aplastar estos compromisos juntos.

Este es, por supuesto, un escenario simplificado, hay muchas maneras de dividir los cambios en varias confirmaciones, como el uso del command de estadificación interactivo git add -p