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

152

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

vfclists
fonte

Respostas:

227

Sim, se você garantir que o git expanda um glob em vez do seu shell, ele corresponderá a qualquer nível, então algo assim (aspas são importantes) deve funcionar bem.

git diff -- '*.c' '*.h'
CB Bailey
fonte
1
Ok, minha versão do git era muito antiga. Funciona como anunciado com 1.7.8. Excelente.
Mat
3
Meu trabalhou com a expansão cinta, a lagit diff -- *.{c,h,etc}
Matt Fletcher
9
o traço duplo é importante, por exemplo. git diff master HEAD -- "*filename.txt"também útil é ogit diff master HEAD --name-only
neaumusic
As aspas simples ( '') também são importantes! git diff -- src/*.jsdeveria ser #git diff -- 'src/*.js'
Nickofthyme 18/03/19
1
Também deve fazer isso no diretório raiz do repositório git.
John Jiang
10

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

git diff -- '***.py'
Bohumir Zamecnik
fonte
1
Para mim, é a melhor solução. Você também pode excluir alguns arquivos / diretórios. Por exemplo:git diff -- '***.py' ':!.Trashes'
Bartosz
O que os asteriscos triplos fazem (comparado ao asterisco único)?
Jann Poppinga 03/07
IIRC, o asterisco duplo significa (possivelmente) diretórios aninhados (mesmo vazios) e o asterisco e .py simples, o nome do arquivo. Portanto, deve ser um arquivo * .py no diretório atual ou em qualquer diretório aninhado.
Bohumir Zamecnik
8

Use o globstar do seu shell (que faz uma pesquisa recursiva) 1 , 2 :

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 filtrar os diretórios com a extensão .py :)


1 eu gosto de fazer git diff -- {.,**}/*.pynormalmente

2 Quando o globstar está ativado, git diff -- **/*.pyjá inclui ./*.py. Na página de manual do Bash: 'Se seguido por a /, dois * s adjacentes corresponderão apenas a diretórios e subdiretórios.'

ver
fonte
4

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

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

Espaço em branco seguro, e você também pode ter várias extensões:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
Esteira
fonte
3

Argumento de linha de comando para extensão.

git diff *.py

Como alternativa, você pode canalizar findpara git diff:

find . -name '*.py' -type f | git diff --
hughdbrown
fonte
por favor, torne a resposta um pouco mais legível. Você poderia ter sido suficiente com git diff *.pye sem os cabeçalhos dos gritos
veja
1
Os 'cabeçalhos dos gritos' eram # comentários em um script de shell.
hughdbrown
Esta é a única solução que funcionou para mim, as aspas (etc.) não funcionaram no prompt de comando do Windows.
Ed Bayiates
1

Conforme testado no git versão 2.18.0, a extensão do arquivo deve ser citada entre aspas duplas. Se você deseja encontrar as últimas diferenças entre o repositório local e o remoto, após puxar, você pode usar:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Por exemplo:

git diff master@{1} origin/master --name-only "*.cs"
marjan.javid
fonte
1
Funcionou para mim quando eu forneci - antes da extensão, desta forma,git diff master@{1} origin/master --name-only -- "*.cs"
333
0

Nenhuma das respostas acima parece funcionar para mim git bashno Windows. Não tenho certeza se é uma versão (estou usando o 1.8.4) ou Windows / bash; Além disso, no meu caso, eu queria diferenciar dois ramos em que cada ramo tinha arquivos adicionais que não estavam presentes no outro ramo (portanto, os baseados em 'localizar' são negligentes).

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

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
Yonatan
fonte
Este stackoverflow.com/a/8554987/4233229 obras, mas um tem que usar aspas duplas em vez de único para Windows
lcnittl
0

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

Encontrei esta pergunta porque queria excluir .infoarquivos de git diff. Consegui isso organizando-o com git add *.info, o que reduz os arquivos restantes.

Alan Whitelaw
fonte
0

Acabei com isso:

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

Isso mostra diffs para a confirmação especificada apenas se o nome do arquivo contiver a palavra 'teste' (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.

MatrixManAtYrService
fonte