¿Cómo hacer que git muestre las confirmaciones en un rango de fechas específico para la fecha del autor?

82

Aparentemente esto :

git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"

los filtros se comprometen en función de la fecha de confirmación . ¿Cómo puedo hacer que muestre confirmaciones para un rango de fechas de autor específico?

Mr_and_Mrs_D
fuente
Posible duplicado del registro
confirmación

Respuestas:

39

No puedes, al menos, no solo en Git. (Recordatorio para otras personas que visitan esta pregunta: no se trata de ver la fecha del autor, se trata de seleccionar confirmaciones por la fecha del autor, a la --since/ --aftery --until/ --before. Estos selectores usan la fecha de confirmación , no la fecha del autor. Considere como un ejemplo extremo una confirmación hecho "ahora", por lo que su fecha de confirmación es en la década de 2000, pero con fecha anterior en el campo de fecha de autor a algún día del año 1999. Si su rango de selección es "en cualquier momento cerca del cambio de siglo", -seleccione este compromiso, ya que su fecha de compromiso es "ahora", más de una década después de 1999.)

Considero que esto es un pequeño error en Git: debería poder solicitar que use el campo de fecha del autor en cualquier lugar donde pueda solicitar que use el campo de fecha de confirmación. Esto es fácil con el formato de registro , ya que tenemos %ady %cdsimilares, pero es imposible con la selección de confirmación . Lo más cercano que tenemos es que git rev-listpodemos ordenar por fecha de autor (dentro de la clasificación topográfica general).

Un interruptor global en git rev-list, como --use-author-date, funcionaría como un simple parche, y no sería demasiado difícil añadir a Git, pero creo que sería mejor tener --min-author-agey --max-author-ageo similar y una bandera "ordenar por fecha de autor" (independiente de la --topo-orderbandera general , por lo que la configuración de ambas banderas tiene el mismo efecto que --author-date-order).

Como solución alternativa, puede enumerar todas las confirmaciones potencialmente interesantes (con git rev-listo equivalente, como git log: use cualquier especificador que haga que las confirmaciones sean potencialmente interesantes, excepto para los filtros de fecha: en este caso, eso es solo --all) y extraer todos sus campos de fecha de autor (con git log --format=%ato lo que sea), luego haga su propia poda de la lista de ID de confirmación, luego vuelva a enviar las ID de confirmación restantes a git log --no-walk. Pero esto es doloroso en el mejor de los casos. Vea la respuesta de Tim Beigeleisen usando awk para más información.

torek
fuente
Gracias por su autoridad aclarando la confusión para mí - esto me ha estado molestando por mucho tiempo y pasé mucho tiempo revisando las páginas del manual para tratar de encontrar el interruptor que no existe. ¿Hay un error ya abierto para esto?
Mr_and_Mrs_D
No sé si la gente de Git considera que esto es un error. Consulte github.com/git/git para obtener enlaces a las listas de correo.
torek
119

Quizás me estoy perdiendo algo, pero ¿no sería suficiente?

git log --pretty=format:"%ad - %an: %s" --after="2016-01-31" --until="2017-03-10" --author="John Doe"

Ver también aquí

jackdbd
fuente
18
@RossSolomon: que muestra la fecha del autor, pero selecciona por la fecha de confirmación. Para tomar un ejemplo extremo, supongamos que realizo una confirmación con la fecha del autor establecida en 1999 y la fecha de confirmación establecida en 01-01-2017. La %addirectiva le mostrará esta confirmación creada en 1999, ¡aunque eso es mucho antes de 2016!
torek
7
"Quizás me estoy perdiendo algo" Sí, todo el punto de la pregunta. Esto usa exactamente el mismo método de filtrado que el OP, basado en la fecha de confirmación, pero solo muestra la fecha del autor después de haber filtrado lo que quieren. ¿Cómo es que 18 personas tienen tan mala comprensión lectora?
underscore_d
Ese comando no funciona con el formato de fecha iso-8601 en --before y --after. El formato que me funciona es "dd-mm-ccyy".
hktegner
8
Votar en contra porque esta respuesta no aborda la pregunta, a pesar de ser útil en general.
Ravron
2
Incluso si no responde la pregunta, si me topé con esta respuesta y encontré una solución a mi problema similar pero no el mismo , estoy votando a favor de la respuesta, así de simple. Sin embargo, esto no significa que se deba aceptar la respuesta, y entiendo que alguien la rechace.
Mefitico
30

Usted puede .

Pero como mencionó @torek, es posible que no pueda hacer esto con Git puro. Una opción sería la de tubo de alguna salida de formato bastante desde git logdentro awk, y comprobar la fecha de autor existe:

git log --date=iso --pretty=format:'%ad%x08%aN' | awk '$0 >= "2013-01-01" && $0 <= "2013-12-01"'

Aquí, %adle da al autor la fecha en formato ISO y %aNle da el nombre del autor.

Tim Biegeleisen
fuente
1
Gracias. Seguí adelante y acepté la respuesta de Torek como más completa, pero voté a favor de la suya por dar un punto de partida :)
Mr_and_Mrs_D
2

inspirado en la respuesta de Tim Biegeleisen anterior.

git log --all --date=iso --pretty=format:'%ad%x08%aN %s' | grep 2020-06-09 | sort -u

Hice lo que necesitaba. Quiero la fecha del autor, no la fecha de los compromisos porque reafirmo y aplasto mucho. pero guardo fechas importantes en las confirmaciones de importación.

relacionado con eso, tengo un pequeño ayudante que me permite restablecer el correo electrónico del autor pero manteniendo la fecha del autor original. --reset-author por defecto sobrescribe la fecha del autor.

https://github.com/mathieujobin/git-scripts/blob/master/bin/git-reset-author-but-not-date

en el registro de git anterior, cuando sea necesario, puede agregar %Hpara obtener el gitsha

Mathieu J.
fuente
1
% x08 en formato bonito significa ascii 08, que es retroceso, por lo que se come el último dígito del% ad anterior que es la fecha del autor en formato ISO, así que utilizo esta variación (también agregué dos puntos después del nombre del autor):git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u
sicko