it-swarm-pt.tech

Como filtrar o git diff com base nas extensões de arquivo?

Existe uma opção para restringir git diff a um determinado conjunto de extensões de arquivo?

113
vfclists

Sim, se você garantir que o git expande um glob ao invés do seu Shell, ele irá corresponder em qualquer nível, então algo assim (aspas são importantes) deve funcionar bem.

git diff -- '*.c' '*.h'
175
CB Bailey

Use o globstar do seu Shell (que faz uma pesquisa recursiva)12:</ p>

shopt -s globstar 
git diff -- *.py **/*.py

ou use find:

find -name '*.py' -print0 | xargs -0 git diff --

Ambos são nomes especiais e prova de espaço em branco. Embora você possa querer filtrar por diretórios com a extensão .py :)


1 Eu gosto de fazer git diff -- {.,**}/*.py normalmente

2 </ sup> Quando globstar está habilitado, git diff -- **/*.py já inclui ./*.py. Na manpage do Bash: 'Se seguido por um /, dois adjacentes * s irão corresponder apenas a diretórios e subdiretórios.'

8
sehe

Para incluir arquivos recursivamente (incluindo o diretório atual), isso funcionou para mim:

git diff -- '***.py'
4
Bohumir Zamecnik

Argumento de linha de comando para extensão.

git diff *.py

Em alternativa, você pode canalizar find para git diff:

find . -name '*.py' -type f | git diff --
1
hughdbrown

Para padrões de arquivo simples, isso parece funcionar:

$ git ls-files -zm '*.txt' | xargs --null git diff

Espaços em branco seguros e você também pode ter várias extensões:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
1
Mat

Acabei com isso:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Isto mostra diffs para o commit especificado somente se o nome do arquivo contiver o Word 'test' (sem distinção entre maiúsculas e minúsculas) e não terminar com .sql, modifique o pipeline conforme necessário para o seu caso.

0
MatrixManAtYrService

Nenhuma das respostas acima parece funcionar para mim em git bash no Windows. Não tenho certeza se é uma coisa de versão (estou usando 1.8.4) ou o Windows/bash coisa; também, no meu caso, eu queria diferenciar duas ramificações, onde cada ramificação tinha arquivos adicionais que não estavam presentes na outra ramificação (portanto, os baseados na 'localização' são remissivos).

De qualquer forma isso funcionou para mim (no meu exemplo, procurando por uma diferença entre arquivos python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
0
Yonatan

git diff mostrará apenas diferenças em arquivos não sincronizados.

Eu encontrei esta pergunta porque queria excluir os arquivos .info de git diff. Consegui isso encenando com git add *.info, o que reduz os arquivos restantes.

0
Alan Whitelaw

Como eu testei no git versão 2.18.0, devemos escrever a extensão do arquivo entre aspas duplas. Se você quiser encontrar as últimas diferenças entre o repositório local e o remoto, depois de puxar, você pode escrevê-lo como abaixo:

git diff [email protected]{1} YourBranchName --name-only "*.YourFileExtionsion"

Por exemplo:

git diff [email protected]{1} Origin/master --name-only "*.cs"

0
marjan.javid