Como listar todos os arquivos em um commit?
Estou à procura de um comando simples git
que fornece uma lista formatada de todos os ficheiros que faziam parte do commit dado por um hash (SHA1), sem informações estranhas.
eu tentei:
git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d
apesar de enumerar os ficheiros, também inclui informação indesejada de diferenças para cada um deles.
existe outro comando git
que irá fornecer apenas a lista que eu quero, para que eu possa evitar analisá-la a partir do Resultado git show
?
26 answers
Modo preferido (porque é um comando de canalização ; destinado a 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 ; destinado a ser virado para o utilizador)
$ git show --pretty="" --name-only bd61ad98
index.html
javascript/application.js
javascript/ie6.js
- o
--no-commit-id
suprime o resultado do ID de persistência. - o argumento
--pretty
especifica um texto de formato vazio para evitar o cruzeiro no início. - o argumento
--name-only
mostra apenas os nomes dos ficheiros que eram afectado (obrigado Hank). - o argumento
-r
é repetir em sub-árvores
Se quiser obter a lista de ficheiros alterados:
git diff-tree --no-commit-id --name-only -r <commit-ish>
Se você quiser obter a lista de todos os arquivos em um commit, você pode usar
git ls-tree --name-only -r <commit-ish>
git show --name-only <sha>
Eu uso pessoalmente 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 não gostar/quiser 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
Também podes fazer
git log --name-only
E você pode navegar através de vários commits, mensagens de commit e os arquivos alterados.
Escreva q para obter o seu prompt de volta.
Recentemente eu precisava listar todos os arquivos alterados entre dois commits. Então eu usei este comando (também * específico do nix)
git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq
Update : ou como Ethan aponta abaixo
git diff --name-only START_COMMIT..END_COMMIT
Se usar --name-status
também irá incluir a alteração (adicionada, modificada, apagada, etc) ao lado de cada ficheiro
git diff --name-status START_COMMIT..END_COMMIT
Forma mais simples:
git show --stat (hash)
Se realmente quiser apenas os nomes dos ficheiros, poderá adicionar a opção --name-only
.
git show --stat --name-only (hash)
Uso alterado com bastante frequência. Para a configurar:
git config --global alias.changed 'show --pretty="format:" --name-only'
Depois:
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
Usando o comando 'diff' padrão do git (também bom para programação):
git diff --name-only <sha>^ <sha>
Se você quiser também o estado dos arquivos alterados:
git diff --name-status <sha>^ <sha>
Isto funciona bem com os commits do merge.
$ git log 88ee8^..88ee8 --name-only --pretty="format:"
Utilizar
git log --name-status
Isto mostrar-lhe-á o id de commit, a mensagem, os ficheiros alterados e se foi modificado, criado, adicionado ou apagado. Uma espécie de comando único.
Ok, existem algumas maneiras de mostrar todos os arquivos em um commit particular...
Para reduzir a informação e mostrar apenas os nomes dos ficheiros que foram enviados, pode simplesmente adicionar a opção --name-only
ou --name-status
..., estas opções apenas mostram os nomes dos arquivos que são diferentes dos commits anteriores como você quer...
Assim você pode fazer git diff
seguido por --name-only
, com dois commit hashes após <sha0> <sha1>
, algo como abaixo:
git diff --name-only 5f12f15 kag9f02
Também crio a imagem abaixo para mostrar tudo passos a percorrer nesta situação:
Uso isto para obter uma lista de ficheiros modificados entre dois conjuntos de alterações:
git diff --name-status <SHA1> <SHA2> | cut -f2
Eu gosto de usar
git show --stat <SHA1>^..<SHA2>
git show --name-only commitCodeHere
git diff --name-status <SHA1> <SHA1>^
Também há git whatchanged
, que é mais baixo do que git log
NAME
git-whatchanged - Show logs with difference each commit introduces
Ele emite o resumo de commit com uma lista de ficheiros por baixo com os seus modos e se for Adicionado (A
), eliminado (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
...
Eu sei que esta resposta não corresponde a nenhuma informação estranha.", mas eu ainda acho que esta lista é mais útil do que apenas os nomes dos arquivos.
Use um comando simples de uma linha, se apenas quiser que a lista de ficheiros seja alterada na última persistência:
git diff HEAD~1 --name-only
Lista os ficheiros que foram alterados numa persistência:
git diff --name-only SHA1^ SHA1
Isto não mostra mensagens de Registo, novas linhas extra ou qualquer outra confusão. Isso funciona para qualquer commit, não apenas o atual. Não sei porque ainda não foi mencionado, por isso vou adicioná-lo.
Mostra o registo.
O COMMIT pode ser em branco ("") ou o sha-1 ou o sha-1 encurtado.
git log COMMIT -1 --name-only
Isto irá listar apenas os arquivos, muito útil para o processamento posterior.
git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"
Encontrei uma resposta perfeita para isto:
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
Uma combinação de "git show --stat
" (obrigado Ryan) e alguns comandos sed devem reduzir os dados para ti:
git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"
Isso irá produzir apenas a lista de arquivos modificados.
Existe um truque simples para ver como uma listagem de arquivos, basta adicionar :
Depois do hash.
git show 9d3a52c474:
Depois podes perfurar,
git show 9d3a52c474:someDir/someOtherDir
Se você carregar num ficheiro, irá obter a versão raw do ficheiro; que, por vezes, é o que deseja se só estiver à procura de uma referência ou de pedaços de código (os diffs podem fazer com que tudo fique uma confusão), {[[6]}
git show 9d3a52c474:someDir/someOtherDir/somefile
A única desvantagem deste método é que ele não mostra facilmente uma árvore de arquivos.
git show HEAD@{0}
Funciona bem para mim
Para aqueles que cobrem a SVN você vai achar isto útil: (esta é uma combinação de ideias de diferentes tópicos, eu só aceito o crédito de saber como usar copy/paste)
.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
git status
Isto vai mostrar o que não é encenado e o que é encenado.