Devido à burocracia, preciso obter uma lista de todos os arquivos alterados no meu repositório para um relatório (comecei com o código-fonte existente).
O que devo executar para obter esta lista?
Devido à burocracia, preciso obter uma lista de todos os arquivos alterados no meu repositório para um relatório (comecei com o código-fonte existente).
O que devo executar para obter esta lista?
Respostas:
Para arquivos alterados entre um determinado SHA e seu commit atual:
git diff --name-only <starting SHA> HEAD
ou se você deseja incluir arquivos alterados, mas ainda não confirmados:
git diff --name-only <starting SHA>
De maneira mais geral, a sintaxe a seguir sempre informa quais arquivos foram alterados entre duas confirmações (especificadas por seus SHAs ou outros nomes):
git diff --name-only <commit1> <commit2>
git diff --name-only <SHA> <SHA>^
--name-statussinalizador em vez de --name-onlyé útil para obter uma lista de arquivos e ver seu status de modificação, como Adicionado ou Modificado.
--name-statusmostra o que aconteceu a eles
Para encontrar os nomes de todos os arquivos modificados desde seu último commit:
git diff --name-only
Ou (para obter mais informações, incluindo arquivos não rastreados):
git status
Para listar todos os arquivos alterados rastreados em estágios :
git diff --name-only
Para listar todos os arquivos alterados rastreados em estágios :
git diff --name-only --staged
Para listar todos os arquivos alterados rastreados em estágios e não em estágios :
{ git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
Para listar todos os arquivos não rastreados (os listados por git status, para não incluir nenhum arquivo ignorado):
git ls-files --other --exclude-standard
Se você estiver usando isso em um shell script, e você quer verificar programaticamente se estes comandos retornou nada, você vai estar interessado em git diff's --exit-codeopção.
Quando adicionei / modifiquei / excluí muitos arquivos (desde a última confirmação), gosto de ver essas modificações em ordem cronológica.
Para isso eu uso:
Para listar todos os arquivos não faseados:
git ls-files --other --modified --exclude-standard
Para obter a data da última modificação de cada arquivo:
while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done
Embora ruvim sugira nos comentários :
xargs -0 stat -c '%y %n' --
Para classificá-los do mais antigo para o mais recente:
sort
Um alias facilita o uso:
alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done|sort'
Ou (mais curto e mais eficiente, graças ao ruvim )
alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'
Por exemplo:
username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd
Agora posso revisar minhas modificações, da mais antiga para a mais recente.
xargse chamada única stat? O one-liner completo:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
Eu preciso de uma lista de arquivos que alteraram o conteúdo entre dois commits (adicionados ou modificados apenas), então usei:
git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>
As diferentes opções de filtro diff da documentação do git diff :
filtro diff = [(A | C | D | M | R | T | U | X | B)… [*]]
Selecione apenas os arquivos adicionados (A), copiados (C), excluídos (D), modificados (M), renomeados (R), com o tipo (por exemplo, arquivo normal, link simbólico, submódulo, ...) alterado (T), não estão imersos (U), são desconhecidos (X) ou tiveram seu emparelhamento quebrado (B). Qualquer combinação dos caracteres de filtro (incluindo nenhum) pode ser usada. Quando * (Tudo ou nenhum) é adicionado à combinação, todos os caminhos são selecionados se houver algum arquivo que corresponda a outros critérios na comparação; se não houver arquivo que corresponda a outros critérios, nada será selecionado.
Além disso, essas letras maiúsculas podem ser excluídas para excluir. Por exemplo, --diff-filter = ad exclui caminhos adicionados e excluídos.
Se você deseja listar também o status (por exemplo, A / M), mude --name-onlypara --name-status.
A lista de estágios modificados pode ser obtida usando git statuso grepcomando abaixo. Algo como git status -s | grep M:
root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
M src/.../file1.js
M src/.../file2.js
M src/.../file3.js
....
Com git showvocê pode obter um resultado semelhante. Para consultar o commit (como parece na git logvisualização) com a lista de arquivos incluídos, use:
git show --name-only [commit-id_A]^..[commit-id_B]
Onde [commit-id_A]está o commit inicial e [commit-id_B]o último commit que você deseja mostrar.
Atenção especial com o ^símbolo. Se você não colocar isso, as informações de commit-id_A não serão implantadas.
Se você quiser verificar os arquivos alterados, precisará cuidar de muitas pequenas coisas, como qual será o melhor para usar, como se você quiser verificar quais arquivos foram alterados, apenas digite
status git - mostrará os arquivos com alterações
se você quiser saber quais alterações devem ser feitas, ele pode ser verificado de maneiras,
git diff - mostrará todas as alterações em todos os arquivos
só é bom quando apenas um arquivo é modificado
e se você quiser verificar um arquivo específico, use
git diff