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?

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'

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'

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


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

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

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"

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`

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.