¿Cómo puedo hacer que git muestre una lista de los archivos que se están rastreando?

535

Usando la línea de comando git, ¿cómo puedo hacer que git muestre una lista de los archivos que se están rastreando en el repositorio?

RobertL
fuente
55
posible duplicado de archivos
Kristján
2
Yo creo que si. Pero no parece correcto marcar esto como dup cuando tiene una mejor respuesta.
Lindhe
55
en un universo paralelo, es sorprendente cuán similar es esta pregunta que incluye todas las respuestas, pero cada una con su propio estilo distintivo.
Jeff Puckett

Respuestas:

628

Si desea enumerar todos los archivos que actualmente se rastrean en la rama master, puede usar este comando:

git ls-tree -r master --name-only

Si desea una lista de archivos que alguna vez existieron (es decir, incluidos los archivos eliminados):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
fuente
61
Use git ls-tree -r HEAD --name-only-only si desea enumerar los archivos de la rama actual
Ramast
3
¿Por qué los directorios no están en la lista?
Shuzheng
13
@NicolasLykkeIversen: gitno versiona directorios directamente. En su lugar, almacena archivos y sus rutas. ls-treegenerará todos los archivos versionados. Para comprender mejor esta distinción, intente organizar un directorio vacío en git. El directorio vacío nunca aparecerá en los cambios por etapas. La única forma de versionar un directorio tan vacío es en realidad versionar un archivo bajo el directorio. Para los casos de uso en los que necesita un directorio de marcador de posición vacío en el control de versiones, puede crear un archivo ficticio debajo del directorio y una versión de ese. Espero que la explicación sea clara.
Tuxdude
2
Solo tenga en cuenta ls-tree masterque no muestra los archivos rastreados en el área de ensayo.
nn0p
¿Es posible mostrar solo el directorio de nivel superior si incluye muchos subdirectorios y archivos?
Blaszard
192

Los archivos administrados por git se muestran por git ls-files. Echa un vistazo a su página de manual.

vonbrand
fuente
44
Parece que solo muestra archivos en o debajo del directorio actual.
Lyle Z
11
¿Te importa si edito esto para incluir las secciones relevantes de la página del manual?
Nathan Basanese
1
@NathanBasanese quizás pueda agregar otra respuesta con esa información.
José Castro
@LyleZ Quizás esto está destinado a estar en consonancia con ls... ols -R
flow2k
1
@LyleZ Además, este comportamiento es el mismo con git ls-tree- es relativo al pwd.
flow2k
18

La respuesta aceptada solo muestra archivos en el árbol del directorio actual. Para mostrar todos los archivos rastreados que se han confirmado (en la rama actual), use

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree hace que el comando se ejecute como si estuviera en el directorio raíz del repositorio.
  • -rrecurre en subdirectorios. Combinado con --full-treeesto, le proporciona todos los archivos rastreados y comprometidos.
  • --name-only elimina la información de permisos / SHA para cuando solo quieres las rutas de los archivos.
  • HEADespecifica para qué rama desea la lista de archivos rastreados y comprometidos. Puede cambiar esto a mastercualquier otro nombre de sucursal, pero HEADes la confirmación que ha verificado en este momento.

Este es el método de la respuesta aceptada a la ~ pregunta duplicada https://stackoverflow.com/a/8533413/4880003 .

Nathan
fuente
¡Gracias! Esto también funciona para repos desnudos.
hzpc-joostk
5

Es posible que desee una salida de color con esto.

Uso esta línea para enumerar los archivos y directorios rastreados en el directorio actual de la rama actual:

ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)

Es posible que desee agregarlo como un alias:

alias gl='ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)'

Si desea enumerar archivos de forma recursiva:

'ls' --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)

Y un alias:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Idiota
fuente
El glralias que ya ha proporcionado parecía un poco raro, así que hice una versión más compatible con el formato del primer alias que ya ha proporcionado: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Probado con git version 2.20.1Debian 10.
baltakatei