¿Cómo enumerar todos los archivos en una confirmación?

2794

Estoy buscando un gitcomando simple que proporcione una lista bien formateada de todos los archivos que fueron parte de la confirmación dada por un hash (SHA1), sin información extraña.

Yo he tratado:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Aunque enumera los archivos, también incluye información de diferencias no deseadas para cada uno.

¿Hay otro gitcomando que proporcione solo la lista que quiero, para que pueda evitar analizarlo desde la git showsalida?

Philip Fourie
fuente
43
Vine aquí buscando algo un poco diferente. Quiero ver todos los archivos modificados para un conjunto de confirmaciones y terminar usando git log --until 2013-05-21 --pretty="short" --name-onlycon un buen efecto.
Expiación limitada el
44
Utilice este comando para obtener todos los cambios de las nconfirmaciones anteriores hasta master:git diff-tree --name-status -r @{3} master
ako
3
git diff --name-only master- Para enumerar TODOS los archivos modificados en la rama actual, en comparación con la rama maestra.
Noam Manos

Respuestas:

3764

Forma preferida (porque es un comando de plomería ; destinado a ser programático):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Otra forma (menos preferida para los scripts, porque es un comando de porcelana ; destinado a ser dirigido al usuario)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • Los --no-commit-idsuprime la comprometen salida ID.
  • El --prettyargumento especifica una cadena de formato vacía para evitar el cruft al principio.
  • El --name-onlyargumento muestra solo los nombres de archivo que se vieron afectados (Gracias Hank). Utilice en su --name-statuslugar, si desea ver qué sucedió con cada archivo ( D electo, M odificado, A dded)
  • El -rargumento es recurrir a subárboles.
Ryan McGeary
fuente
25
Cabe señalar que diff-treeno funcionará al mirar la confirmación de raíz.
jbranchaud
327
Reemplazar la --name-onlyopción con --name-statusdará un resumen más claro.
Kurt Zhong
20
Si desea que funcione en la confirmación raíz, use el indicador --root. Desde la página de manual: "Cuando se especifica --root, la confirmación inicial se mostrará como un gran evento de creación. Esto es equivalente a un diff contra el árbol NULL".
Chris
24
git log --name-only -n 1 <hash>El último compromiso sería:git log --name-only -n 1 HEAD~1..HEAD
Kurt
10
Si alguien se pregunta (como yo) por qué se "prefiere" la primera forma, se remonta al comentario de @drizzt; git showes "porcelana" (destinada al usuario) y git diff-tree"fontanería" (destinada a ser utilizada mediante programación, por ejemplo, desde scripts). La interfaz para el primero puede cambiar con el tiempo (por lo que los mantenedores de git podrían caerse, --name-onlyaunque no me imagino que lo harían ) por razones de uso, mientras que la interfaz para el segundo se mantendrá lo más estable posible por razones de compatibilidad.
Killscreen
237

Si desea obtener la lista de archivos modificados:

git diff-tree --no-commit-id --name-only -r <commit-ish>

Si desea obtener una lista de todos los archivos en una confirmación, puede usar

git ls-tree --name-only -r <commit-ish>
Jakub Narębski
fuente
1
El árbol ls con --name-only no parece funcionar en 1.6.4.4 o 1.6.3.3. ¿Crees que esto es un error?
krosenvold
git ls-tree --name-only HEAD(el parámetro <commit-ish> es obligatorio ; en este ejemplo es HEAD) funciona para mí con git versión 1.6.4.3
Jakub Narębski
2
Resulta que el orden de los parámetros es significativo aquí. El de su publicación no funciona, mientras que el de su respuesta funciona, al menos hasta que actualice su publicación;)
krosenvold
55
Pase --no-commit-idpara evitar imprimir el SHA1, así:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor
3
@CoDEmanX: No te perdiste agregar -r/ -topción, ¿verdad? Porque diff-tree maneja los archivos modificados y agregados. Si desea enumerar todos los archivos nuevos (agregados), usegit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski el
226

Asumiré que gitkno se desea para esto. En ese caso, inténtalo git show --name-only <sha>.

Hank Gay
fuente
36
--name-only es suficiente en la mayoría de los casos donde lo necesitaba; Por lo tanto, voté por la solución más corta (y la única que recordaría en 1 intento).
Erik S
25
O --name-status.
Neil Traft
Como alguien a quien realmente le gusta CLI git, en gitkrealidad es una forma decente de revisar los archivos y mostrar el archivo en el que está el diff. Por ejemplo, el código que revisa una confirmación de monstruo de un compañero.
Elijah Lynn
192

Yo personalmente uso la combinación de --stat y --oneline con el comando show :

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

Si no le gustan / desea las estadísticas de adición / eliminación, puede reemplazar --stat con --name -only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
Tuxdude
fuente
44
¡Esto es genial! Básicamente le da el resumen del archivo que Github muestra en la parte superior de una vista de confirmación. Gracias.
trisweb
Muy agradable. Para definir un alias: alias gits='git show --stat --oneline', a continuación, gitspor sí mismo muestra los últimos cambios (en pista), mientras que gits b24f5fbse puede utilizar para mostrar los cambios de cualquier revisión.
Brent Faust
55
También se podría crear un alias git ... por ejemplo, tal vez git config --global alias.changes 'show --stat --oneline'. Luego puede escribir git changes(con un commit-ish opcional) y obtener el resultado de los primeros ejemplos anteriores.
lindes
Git para Windows requiere comillas dobles:git config --global alias.changes "show --stat --oneline"
Alchemistmatt
3
Agradable. Y a diferencia de la respuesta aceptada, git showtambién funciona para revisar los cambios escondidos: por ejemplogit show --stat --oneline stash@{1}
Jeff Ward,
83

También puedes hacer

git log --name-only

y puede navegar a través de varias confirmaciones, mensajes de confirmación y los archivos modificados.

Escriba q para recuperar su solicitud.

Indu Devanath
fuente
Gracias, ayuda. Por cierto: se usa git show 5944ad2a8b5 --name-onlypara enumerar el nombre de una confirmación específica
LiuWenbin_NO.
68

Recientemente necesitaba enumerar todos los archivos modificados entre dos confirmaciones. Así que usé este comando (también * nix específico)

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Actualización : O como Ethan señala a continuación

git diff --name-only START_COMMIT..END_COMMIT

El uso --name-statustambién incluirá el cambio (agregado, modificado, eliminado, etc.) junto a cada archivo

git diff --name-status START_COMMIT..END_COMMIT
lunohodov
fuente
44
Si usa, git diff --name-status START_COMMIT..END_COMMITentonces no necesita el seguimiento |sort | uniq.
Ethan
Corrección al comentario anterior:git diff --name-only START_COMMIT..END_COMMIT
Ethan
Esto es lo que estaba buscando. Como lo he usado: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Quería una lista de cambios de código solo para un gran PR que había agregado miles de diseños PNG y XML.
AutonomousApps
63

La forma mas simple:

git show --stat (hash)

Eso es más fácil de recordar y le dará toda la información que necesita.

Si realmente desea solo los nombres de los archivos, puede agregar la --name-onlyopción.

git show --stat --name-only (hash)

VaTo
fuente
2
--name-only todavía incluirá un par de líneas de encabezado que contienen información como el autor, la fecha y el mensaje de confirmación.
devorado elysium
el único que encontré que funciona para el commit de fusión
Alex Punnen
47

Yo uso el alias cambiado con bastante frecuencia. Para configurarlo:

git config --global alias.changed 'show --pretty="format:" --name-only'

entonces:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

Comandos similares que pueden ser útiles:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only
tomashin
fuente
40

Utilizar

git log --name-status

Esto le mostrará la identificación de confirmación, el mensaje, los archivos modificados y si se modificó, creó, agregó o eliminó. Algo de un comando todo en uno.

alpha_989
fuente
38

Usando el comando git diff estándar (también bueno para scripting):

git diff --name-only <sha>^ <sha>

Si desea también el estado de los archivos modificados:

git diff --name-status <sha>^ <sha>

Esto funciona bien con commits de fusión.

vquintans
fuente
26

prueba este comando para el nombre y cambia el número de línea

git show --stat <commit-hash>

solo mostrar nombres de archivos

git show --stat --name-only  <commit-hash>

para obtener el último hash de confirmación, intente este comando

git log -1

última confirmación con mostrar el nombre del archivo y el estado del archivo modificar, crear o eliminar

 git log -1 --oneline --name-status <commit-hash>

o para todos

git log

para obtener información más avanzada sobre el registro de git, lea este artículo

https://devhints.io/git-log-format

https://devhints.io/git-log

Jignesh Joisar
fuente
1
@DanFare "fatal: argumento no reconocido: - solo nombres" de 2.20.1.windows.1
usuario2864740
24
$ git log 88ee8 ^ .. 88ee8 --name-only --pretty = "format:"
Pat Notz
fuente
20

OKAY, hay un par de formas de mostrar todos los archivos en un commit particular ...

Para reducir la información y mostrar solo los nombres de los archivos que se comprometieron, simplemente puede agregar --name-onlyo--name-status marcar ..., estas banderas solo le muestran los nombres de archivo que son diferentes de las confirmaciones anteriores como desee ...

Entonces puede hacer git diffseguido --name-only, con dos hashes de confirmación después <sha0> <sha1>, algo como a continuación:

git diff --name-only 5f12f15 kag9f02 

También creo la imagen a continuación para mostrar todos los pasos a seguir en estas situaciones:

git diff --nombre-solo 5f12f15 kag9f02

Alireza
fuente
¿Por qué dos árbitros (los llamas hashes)?
Hakre
15

Lo uso para obtener una lista de archivos modificados entre dos conjuntos de cambios:

git diff --name-status <SHA1> <SHA2> | cut -f2
usuario135507
fuente
Sí, pero el estado puede ser bastante útil (por ejemplo, es posible que desee grep para mostrar todos los archivos, excepto los que se han eliminado con algo comogit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson
14

Me gusta usar

git show --stat <SHA1>^..<SHA2>
Michael De Silva
fuente
14

También hay git whatchanged, que es más bajo nivel quegit log

NAME
       git-whatchanged - Show logs with difference each commit introduces

Produce el resumen de confirmación con una lista de archivos debajo de él con sus modos y si hay agregado ( A), eliminado ( D) o modificado ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Daría algo como:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <[email protected]>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

Sé que esta respuesta realmente no coincide "sin información extraña", pero sigo pensando que esta lista es más útil que solo los nombres de archivo.

Koen
fuente
Además, solo un comando en whatchangedlugar de proporcionar parámetros.
Gabrielius
11

Me gusta esto:

git diff --name-status <SHA1> <SHA1>^
skiphoppy
fuente
Creo que esto obtiene los estados del archivo A& D(agregar y eliminar) al revés, porque muestra la diferencia de la confirmación especificada a la confirmación anterior, en lugar de al revés. Debería ser git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi
11

Use un comando simple de una línea, si solo desea que se cambie la lista de archivos en la última confirmación:

git diff HEAD~1 --name-only
Desarrollador-Sid
fuente
8

Enumere los archivos que cambiaron en una confirmación:

git diff --name-only SHA1^ SHA1

Esto no muestra mensajes de registro, nuevas líneas adicionales o cualquier otro desorden. Esto funciona para cualquier commit, no solo para el actual. No sé por qué no ha bastante ha mencionado todavía, así que estoy añadiendo la misma.

Newtonx
fuente
Estos dos se ven iguales: git diff SHA1^ SHA1y git show SHA1.
Vladimir Vukanac
1
@mrW Esos comandos producen una salida similar, pero git showtambién muestra el mensaje de confirmación
Newtonx
8

Mostrar el registro.

COMMIT puede estar en blanco ("") o el sha-1 o el sha-1 acortado.

git log COMMIT -1 --name-only

Esto enumerará solo los archivos, muy útil para su posterior procesamiento.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"
thefreshteapot
fuente
8

Encontré una respuesta perfecta a esto:

git show --name-status --oneline <commit-hash>

Para que yo pueda saber

which files were just modified M

Which files were newly added , A

Which files were deleted , D
Ijaz Ahmad Khan
fuente
5

Una combinación de " git show --stat" (gracias Ryan) y un par de comandos sed deberían recortar los datos para usted:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

Eso producirá solo la lista de archivos modificados.

seanhodges
fuente
5

Hay un truco simple para ver como una lista de archivos, solo agregue :después del hash.

git show 9d3a52c474:

Entonces puedes profundizar,

git show 9d3a52c474:someDir/someOtherDir

Si golpeas un archivo obtendrás la versión sin procesar del archivo; que a veces es lo que quieres si solo estás buscando una buena referencia o piezas clave de código (los diferenciales pueden hacer que todo sea un desastre),

git show 9d3a52c474:someDir/someOtherDir/somefile

El único inconveniente de este método es que no muestra fácilmente un árbol de archivos.

srcspider
fuente
3
git show HEAD@{0}

funciona bien para mi

Bruce
fuente
2

Lo uso para obtener una lista de archivos modificados en commit de fusión

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

o

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml
Piotr Perak
fuente
2

Si está utilizando el complemento oh-my-zsh y git, el atajo glg es útil.

Enrique
fuente
3
¿Acabas de ... cortar todo el código de tu respuesta? Esto es no nada a lo que me referí. ¡No hay información extraña en el resultado resultante como lo solicitó OP, no en su respuesta! Aún tiene una respuesta que genera MUCHA información extraña. Pero ahora, se describe con mucha menos precisión. OP quería superar una lista de archivos, y nada más. Mira lo que glgsale: mucho más. Perdón por la confusion.
RomainValeri 01 de
0

Solo la lista de archivos (ni siquiera el mensaje de confirmación):

git show --name-only --pretty=format:

Por ejemplo, abra todos los archivos modificados en su editor:

"$EDITOR" $(git show --name-only --pretty=format:)
usuario2394284
fuente
-2

Pensé en compartir un resumen de mi alias ... también encuentro que usar 'zsh' es genial con git it chroma keys todo muy bien y te dice que quieres una rama en todo momento cambiando el símbolo del sistema.

Para aquellos que cubren desde SVN, encontrarán esto útil: (esta es una combinación de ideas de diferentes hilos, solo me doy el crédito de saber cómo usar copiar / pegar)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <[email protected]>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <[email protected]>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m
Jim Zucker
fuente
-3

Esto debería funcionar:

git status

Esto mostrará lo que no está en escena y lo que está en escena.

4067098
fuente
77
Sin embargo, la pregunta es sobre cómo obtener la lista de archivos en un commit previamente comprometido, no en el commit about-to-be-commit.
Rup