Como posso fazer com que o git mostre uma lista dos arquivos que estão sendo rastreados?

535

Usando a linha de comando git, como posso fazer com que o git mostre uma lista dos arquivos que estão sendo rastreados no repositório?

RobertL
fonte
5
possível duplicação de arquivos
Kristján
2
Eu acredito que sim. Mas não parece correto marcar isso como dup quando isso tem uma resposta melhor.
Lindhe 30/03/16
5
em um universo paralelo, é estranho como essa pergunta é semelhante, incluindo todas as respostas, mas cada uma com seu próprio toque distinto.
Jeff Puckett

Respostas:

628

Se você deseja listar todos os arquivos que estão sendo rastreados atualmente no ramo master, você pode usar este comando:

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

Se você deseja uma lista de arquivos que já existiram (por exemplo, incluindo arquivos excluídos):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
fonte
61
Use git ls-árvore -r CABEÇA --name-somente se você quer arquivos de lista do ramo atual
Ramast
3
Por que os diretórios não estão listados?
Shuzheng
13
@NicolasLykkeIversen - gitnão versão diretórios diretamente. Em vez disso, armazena arquivos e seus caminhos. ls-treeproduzirá todos os arquivos com versão. Para entender melhor essa distinção, tente preparar um diretório vazio para git. O diretório vazio nunca será exibido nas alterações faseadas. A única maneira de criar a versão de um diretório vazio é, na verdade, fazer a versão de um arquivo no diretório. Para casos de uso em que você precisa de um diretório de espaço reservado vazio no controle de versão, é possível criar um arquivo fictício no diretório e fazer a versão. Espero que a explicação seja clara.
Tuxdude 31/03
2
Observe ls-tree masterque não mostra os arquivos rastreados na área de preparação.
Nn0p
É possível mostrar apenas o diretório de nível superior se ele incluir muitos subdiretórios e arquivos?
Blaszard 25/10
191

Os arquivos gerenciados pelo git são mostrados por git ls-files. Confira sua página de manual.

vonbrand
fonte
4
Isso parece mostrar apenas os arquivos no diretório ou abaixo dele.
Lyle Z
11
Se importa se eu editar isso para incluir as seções relevantes da página de manual?
Nathan Basanese
1
@ NathanBasanese talvez você possa adicionar outra resposta com essas informações.
José Castro
@LyleZ Talvez isso se destina a estar em consonância com ls... ouls -R
flow2k
1
@LyleZ Além disso, esse comportamento é o mesmo com git ls-tree- é relativo ao pwd.
flow2k
18

A resposta aceita mostra apenas arquivos na árvore do diretório atual. Para mostrar todos os arquivos rastreados que foram confirmados (na ramificação atual), use

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree faz com que o comando seja executado como se você estivesse no diretório raiz do repositório.
  • -rse repete em subdiretórios. Combinado com --full-tree, isso fornece todos os arquivos rastreados e confirmados.
  • --name-only remove informações de permissão / SHA para quando você deseja apenas os caminhos do arquivo.
  • HEADespecifica para qual filial você deseja a lista de arquivos confirmados rastreados. Você pode alterar isso para masterou qualquer outro nome de filial, mas HEADé o commit que você efetuou check-out agora.

Este é o método da resposta aceita à pergunta duplicada ~ https://stackoverflow.com/a/8533413/4880003 .

Nathan
fonte
Obrigado! Isso também funciona para repositórios nus.
Hzpc-joostk 02/10/19
5

Você pode querer uma saída colorida com isso.

Eu uso esse one-liner para listar os arquivos e diretórios rastreados no diretório atual da ramificação atual:

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

Você pode querer adicioná-lo como um alias:

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

Se você deseja listar recursivamente os arquivos:

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

E um apelido:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Bloody_fool
fonte
O glralias desde parecia um pouco estranho, então eu fiz uma versão mais consistente com o formato do primeiro alias que você forneceu: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Testado com o git version 2.20.1Debian 10.
baltakatei