Como listar todos os arquivos em uma confirmação?

2794

Estou procurando um gitcomando simples que forneça uma lista bem formatada de todos os arquivos que fizeram parte do commit fornecido por um hash (SHA1), sem informações estranhas.

Eu tentei:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Embora liste os arquivos, também inclui informações diferenciais indesejadas para cada um.

Existe outro gitcomando que fornecerá apenas a lista que eu quero, para evitar a análise da git showsaída?

Philip Fourie
fonte
43
Eu vim aqui procurando algo um pouco diferente. Quero ver todos os arquivos modificados para um conjunto de confirmações e acabados usando git log --until 2013-05-21 --pretty="short" --name-onlycom um bom efeito.
Expiação limitada
4
Use este comando para obter todas as alterações das nconfirmações anteriores até master:git diff-tree --name-status -r @{3} master
ako
3
git diff --name-only master- Para listar TODOS os arquivos alterados na ramificação atual, comparando com a ramificação principal.
Noam Manos

Respostas:

3764

Maneira preferida (porque é um comando de encanamento ; deve ser programático):

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

Outra maneira (menos preferida para scripts, porque é um comando de porcelana ; deve ser voltado para o usuário)

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

  • Os --no-commit-idsuprime a saída ID cometer.
  • O --prettyargumento especifica uma cadeia de formatação vazia para evitar o problema no início.
  • O --name-onlyargumento mostra apenas os nomes de arquivos que foram afetados (obrigado Hank). Use --name-statusem vez disso, se você quiser ver o que aconteceu com cada arquivo ( D eleted, M odificado, A dded)
  • O -rargumento é recursar em subárvores
Ryan McGeary
fonte
25
Deve-se notar que diff-treenão funcionará ao analisar o commit raiz.
Jbranchaud
327
Substituir a --name-onlyopção por --name-statusdará um resumo mais claro.
Kurt Zhong
20
Se você deseja que ele funcione no commit raiz, use o sinalizador --root. Na página do manual: "Quando --root for especificado, o commit inicial será mostrado como um grande evento de criação. Isso é equivalente a um diff na árvore NULL."
Chris
24
git log --name-only -n 1 <hash>O último commit seria:git log --name-only -n 1 HEAD~1..HEAD
Kurt
10
Se alguém está se perguntando (como eu estava) por que a primeira maneira é "preferida", ela volta ao comentário de @drizzt; git showé "porcelana" (destinada a ser voltada para o usuário) e git diff-treeé "canalização" (destinada a ser usada programaticamente, por exemplo, a partir de scripts). A interface para o primeiro pode mudar ao longo do tempo (para que os mantenedores do git possam cair, --name-onlyembora eu não imagine que o faria ) por motivos de usabilidade, enquanto a interface para o último será mantida o mais estável possível por motivos de compatibilidade.
killscreen
237

Se você deseja obter uma lista dos arquivos alterados:

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

Se você deseja obter a lista de todos os arquivos em uma confirmação, pode usar

git ls-tree --name-only -r <commit-ish>
Jakub Narębski
fonte
1
A árvore ls com --name-only não parece funcionar em 1.6.4.4 ou 1.6.3.3. Você acha que isso é um bug?
Krossenvold 10/10/2009
git ls-tree --name-only HEAD(o <comprometer-ish> parâmetro é necessário , neste exemplo, é HEAD) funciona para mim com a versão git 1.6.4.3
Jakub Narębski
2
Acontece que a ordenação dos parâmetros é significativa aqui. A um em seu post não funcionar, enquanto o um em sua resposta faz o trabalho - pelo menos até que você atualize seu post;)
krosenvold
5
Passe --no-commit-idpara evitar a impressão do SHA1, da seguinte maneira:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor
3
@CoDEmanX: Você não deixou de adicionar -r/ -topção, não? Porque o diff-tree lida com arquivos modificados e adicionados. Se você deseja listar todos os novos arquivos (adicionados), usegit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski
226

Vou apenas assumir que gitknão é desejado para isso. Nesse caso, tente git show --name-only <sha>.

Hank Gay
fonte
36
--name-only é suficiente na maioria dos casos em que eu precisei; Portanto, aprovou a solução mais curta (e a única que eu lembraria em uma tentativa).
Erik S
25
Or --name-status.
Neil Traft 18/03/2015
Como alguém que realmente gosta do CLI git, gitké realmente uma maneira decente de revisar os arquivos e exibir o arquivo em que o diff está. por exemplo, código revisando um commit de monstro de um par.
Elias Lynn
192

Eu pessoalmente uso a combinação de --stat e --oneline com o comando show :

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

Se você não gostar / desejar as estatísticas de adição / remoção, poderá substituir --stat por --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
Tuxdude
fonte
4
Isso é ótimo! Basicamente, fornece o resumo do arquivo que o Github mostra na parte superior da visualização de confirmação. Obrigado.
trisweb
Muito agradável. Para definir um alias:, alias gits='git show --stat --oneline'então, gitspor si só, mostra as últimas alterações (em HEAD), enquanto gits b24f5fbpode ser usado para mostrar as alterações de qualquer revisão.
Brent Faust
5
Pode-se também criar um apelido git ... por exemplo, talvez git config --global alias.changes 'show --stat --oneline'. Em seguida, você pode digitar git changes(com um commit-ish opcional) e obter a saída dos primeiros exemplos acima.
Lindes
O Git para Windows requer aspas duplas:git config --global alias.changes "show --stat --oneline"
Alchemistmatt
3
Agradável. E, ao contrário a resposta aceita, git showtambém funciona para analisar mudanças escondidas: por exemplogit show --stat --oneline stash@{1}
Jeff Ward
83

Você também pode fazer

git log --name-only

e você pode navegar por várias confirmações, confirmar mensagens e os arquivos alterados.

Digite q para receber seu prompt de volta.

Indu Devanath
fonte
Obrigado, isso ajuda. BTW: use git show 5944ad2a8b5 --name-onlypara listar o nome de uma confirmação específica
LiuWenbin_NO.
68

Recentemente, eu precisava listar todos os arquivos alterados entre dois commits. Então eu usei este comando (também * nix específico)

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

Atualização : Ou como Ethan aponta abaixo

git diff --name-only START_COMMIT..END_COMMIT

O uso --name-statustambém incluirá a alteração (adicionada, modificada, excluída etc.) ao lado de cada arquivo

git diff --name-status START_COMMIT..END_COMMIT
lunohodov
fonte
4
Se você usar git diff --name-status START_COMMIT..END_COMMIT, não precisará do final |sort | uniq.
Ethan
Correção para o comentário acima:git diff --name-only START_COMMIT..END_COMMIT
Ethan
Era isso que eu estava procurando. Como eu usei-o: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Eu queria uma lista de alterações de código apenas para um enorme PR que adicionasse milhares de PNGs e layouts XML.
AutonomousApps
63

Forma mais simples:

git show --stat (hash)

É mais fácil lembrar e fornecerá todas as informações necessárias.

Se você realmente quiser apenas os nomes dos arquivos, poderá adicionar a --name-onlyopção.

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

VaTo
fonte
2
--name-only ainda incluirá algumas linhas de cabeçalho contendo informações como autor, data e mensagem de confirmação.
devorado elysium
único que eu encontrei que funciona para a fusão comprometer
Alex Punnen
47

Eu uso o alias alterado com bastante frequência. Para configurá-lo:

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

então:

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 semelhantes que podem ser úteis:

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

Usar

git log --name-status

Isso mostrará o ID de confirmação, a mensagem, os arquivos alterados e se foram modificados, criados, adicionados ou excluídos. Um pouco de um comando all-in-one.

alpha_989
fonte
38

Usando o comando git diff padrão (também é bom para scripts):

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

Se você deseja também o status dos arquivos alterados:

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

Isso funciona bem com confirmações de mesclagem.

vquintans
fonte
26

tente este comando para nome e altera o número de linha

git show --stat <commit-hash>

mostrar apenas nomes de arquivo

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

para obter o último hash de confirmação, tente este comando

git log -1

última confirmação com o nome do arquivo show e o status do arquivo modificar, criar ou excluir

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

ou para todos

git log

para obter informações mais avançadas sobre o git log, leia este artigo

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

https://devhints.io/git-log

Jignesh Joisar
fonte
1
@DanFare "fatal: argumento não reconhecido: --names-only" de 2.20.1.windows.1
user2864740
24
$ git log 88ee8 ^ .. 88ee8 --name-only --pretty = "format:"
Pat Notz
fonte
20

OK, existem algumas maneiras de mostrar todos os arquivos em um commit específico ...

Para reduzir as informações e mostrar apenas os nomes dos arquivos confirmados, basta adicionar --name-onlyou --name-statussinalizar ..., esses sinalizadores mostram apenas os nomes dos arquivos que são diferentes dos confirmados anteriormente, conforme desejado ...

Então você pode fazer git diffseguido por --name-only, com dois hashes de confirmação depois <sha0> <sha1>, algo como abaixo:

git diff --name-only 5f12f15 kag9f02 

Também crio a imagem abaixo para mostrar todas as etapas a seguir nessas situações:

git diff - somente nome 5f12f15 kag9f02

Alireza
fonte
Por que dois árbitros (você os chama de hashes)?
hakre
15

Eu uso isso para obter a lista de arquivos modificados entre dois conjuntos de alterações:

git diff --name-status <SHA1> <SHA2> | cut -f2
user135507
fonte
Sim, mas a situação pode ser bastante útil no poço (para isntance, você pode querer grep para exibir todos os arquivos, exceto aqueles que foram excluídos com algo parecidogit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson
14

Eu gosto de usar

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

Há também git whatchanged, que é um nível mais baixo do quegit log

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

Ele gera o resumo da confirmação com uma lista de arquivos abaixo, com seus modos e, se houver adicionado ( A), excluído ( D) ou modificado ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Daria 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
...

Sei que essa resposta realmente não corresponde a "sem informações estranhas", mas ainda acho que essa lista é mais útil do que apenas os nomes de arquivos.

Koen.
fonte
Além disso, apenas um comando em whatchangedvez de fornecer parâmetros.
Gabrielius
11

Eu gosto disso:

git diff --name-status <SHA1> <SHA1>^
skiphoppy
fonte
Eu acho que isso obtém os status do arquivo A& D(adicionar e excluir) ao contrário, porque mostra o diff do commit especificado para o commit anterior, em vez do contrário. Deveria ser git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi
11

Use o comando de uma linha simples, se você quiser que a lista de arquivos seja alterada na última confirmação:

git diff HEAD~1 --name-only
Desenvolvedor-Sid
fonte
8

Liste os arquivos que foram alterados em uma confirmação:

git diff --name-only SHA1^ SHA1

Isso não mostra mensagens de log, novas linhas extras ou qualquer outra confusão. Isso funciona para qualquer confirmação, não apenas para a atual. Não tenho certeza por que ele não bastante sido mencionado ainda, por isso estou adicionando-o.

Newtonx
fonte
Estes dois parecem iguais: git diff SHA1^ SHA1e git show SHA1.
Vladimir Vukanac
1
@mrW Esses comandos produzir resultados semelhantes, mas git showtambém mostra a mensagem de commit
Newtonx
8

Exiba o log.

COMMIT pode ficar em branco ("") ou o sha-1 ou o sha-1 encurtado.

git log COMMIT -1 --name-only

Isso listará apenas os arquivos, muito úteis para processamento adicional.

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

Encontrou uma resposta perfeita para isso:

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

Para que eu possa saber

which files were just modified M

Which files were newly added , A

Which files were deleted , D
Ijaz Ahmad Khan
fonte
5

Uma combinação de " git show --stat" (obrigado Ryan) e alguns comandos sed deve reduzir os dados para você:

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

Isso produzirá apenas a lista de arquivos modificados.

seanhodges
fonte
5

Existe um truque simples para visualizar como uma lista de arquivos, basta adicionar :após o hash.

git show 9d3a52c474:

Em seguida, você pode detalhar

git show 9d3a52c474:someDir/someOtherDir

Se você clicar em um arquivo, obterá a versão bruta do arquivo; que às vezes é o que você deseja se estiver procurando apenas uma boa referência ou trechos de código importantes (as diferenças podem tornar tudo uma bagunça),

git show 9d3a52c474:someDir/someOtherDir/somefile

A única desvantagem desse método é que ele não mostra facilmente uma árvore de arquivos.

srcspider
fonte
3
git show HEAD@{0}

funciona bem para mim

Bruce
fonte
2

Eu uso isso para obter a lista de arquivos alterados na consolidação de mesclagem

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

ou

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

Se você estiver usando o plugin oh-my-zsh e git, o atalho glg é útil.

Henry
fonte
3
Você acabou de ... cortar todo o código da sua resposta? Isto é não em tudo o que eu refered. Nenhuma informação estranha na saída do resultado, conforme solicitado pelo OP, não na sua resposta! Você ainda tem uma resposta que gera MUITA informação estranha. Mas agora, é apenas descrito com muito menos precisão. A OP queria enviar uma lista de arquivos e nada mais. Veja quais glgresultados: muito mais. Desculpe pela confusão.
RomainValeri 01/06/19
0

Somente a lista de arquivos (nem mesmo confirmar a mensagem):

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

Por exemplo, abra todos os arquivos alterados no seu editor:

"$EDITOR" $(git show --name-only --pretty=format:)
user2394284
fonte
-2

Eu pensei em compartilhar um resumo do meu apelido. Também acho que o uso do 'zsh' é ótimo com o git it chroma keys, tudo muito bem e informa que você deseja que o branch esteja o tempo todo, alterando o prompt de comando.

Para aqueles que abordam o SVN, você achará isso útil: (essa é uma combinação de idéias de diferentes threads, eu só me credito em saber como usar copiar / colar)

.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
fonte
-3

Isso deve funcionar:

git status

Isso mostrará o que não está preparado e o que está preparado.

4067098
fonte
7
A questão é obter a lista de arquivos em uma confirmação confirmada anteriormente, mas não na confirmação prestes a ser confirmada.
Rup