2011-12-23 11 views
35

¿Cuál es la línea más simple para obtener la última fecha de compromiso para un grupo de archivos en un repositorio de Git (es decir, para cada archivo, la fecha de la última confirmación que cambió ese archivo)?¿Cómo obtener la última fecha de compromiso para un grupo de archivos en Git?

El contexto para esto es que estoy usando otros comandos Bash para encontrar una larga lista de archivos que coinciden con algunos criterios, y me gustaría simplemente conectar esta lista en un comando Git para obtener la fecha de la última confirmación para cada archivo.

+0

¿Alguna vez has sido capaz de crear un alias de git o lo que sea que elimines las fechas de confirmación de muchos archivos? Tengo una carpeta principal con archivos y carpetas/archivos, etc. Quiero ver la última vez que cambió algo en esa carpeta. – Terry

Respuesta

60

El siguiente comando será útil:

git log -1 --format=%cd filename.txt 

Esto imprimirá la última fecha de modificación de un archivo. El -1 muestra una entrada de registro (la más reciente) y --format=%cd muestra la fecha de confirmación. Consulte la documentación para git-log para obtener una descripción completa de las opciones.

Debería poder extender esto fácilmente para un grupo de archivos.

+1

Esto es útil. ¿Hay una mejor manera de adjuntar el nombre de cada archivo a la fecha que algo como lo siguiente: 'for x in $ (some-command); hacer eco $ x $ (git log -1 --format =% cd $ x); hecho'? – jonderry

+0

No lo creo, ya que todos los códigos de formato '%' se refieren a * commit * en lugar de a * archivo * individual. 'echo' podría ser la forma más directa allí. –

+3

Vale la pena señalar que '% ci' genera fechas con formato ISO (ish); para que puedas ordenarlos También '% ai' muestra la fecha del autor, en lugar de la fecha del autor. –

8

Al extender ligeramente la respuesta de Greg, git log puede tomar varias rutas en su argumento. A continuación, mostrará solo los commits que incluyeron esas rutas. Por lo tanto, para obtener la última confirmación para un grupo de archivos:

git log -1 --format=%cd -- fileA.txt fileB.txt fileC.txt 

estoy bastante basura en shell scripting, así que no estoy muy seguro de cómo construir ese comando a través de la tubería, pero tal vez eso sería un buen tema para otra pregunta.

+2

Sí, pero eso devuelve la última confirmación entre todas las confirmaciones de los archivos, en lugar de la última confirmación * para cada archivo *. – Cameron

+0

Esto funciona pero lamentablemente no dentro de un entorno TravisCI. Cuando TravisCI clona el repositorio, todas las fechas de archivo son la fecha y hora del clon (hoy/ahora) y no la fecha y hora de lo que está en el repositorio. Muy frustrante. – MitchellK

+0

He registrado un problema con TravisCI sobre esto aquí si alguien más está interesado> https://github.com/travis-ci/travis-ci/issues/8539 – MitchellK

1

Aquí está un usando buscar un trazador de líneas (roto en varias para facilitar la lectura, pero gracias a las barras invertidas de salida, copiar y pegar debería funcionar):

find <dirs...> -name '<pattern>' <any other predicate to get what you want> \ 
    -exec git log -1 --format="AAA%ai NNN" '{}' \; \ 
    -exec echo '{}' XXX \; \ 
| tr \\n N | sed -e 's/AAA/\n/g' | sed -e 's/NNNN/ /g' -e 's/XXX.*//g' 

El excesivamente complejo de nueva línea mangling con tr y sed está ahí para obtener la fecha y el nombre de archivo en una línea, y para ignorar los archivos sin seguimiento. Debes asegurarte de que ninguno de tus archivos contenga esos marcadores tontos AAA XXX NNNN.

Cuestiones relacionadas