Deseja excluir o arquivo do "git diff"

229

Estou tentando excluir um arquivo ( db/irrelevant.php) de um diff do Git. Tentei colocar um arquivo no dbsubdiretório chamado .gitattributescom a linha irrelevant.php -diff e também tentei criar um arquivo chamado .git/info/attributescontendo db/irrelevant.php.

Em todos os casos, o db/irrelevant.phparquivo é incluído no diff como um patch binário do Git. O que eu quero é que as alterações nesse arquivo sejam ignoradas pelo comando diff. O que estou fazendo de errado?

Michael
fonte

Respostas:

325

Omg, drivers e awk para excluir um arquivo ruim? Desde o git 1.9 algo que você pode:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ah, elegância! Veja a resposta citada e, para detalhes, esta resposta por @torek

Mr_and_Mrs_D
fonte
4
NOTA: Se você deseja excluir um nome de arquivo específico, deve prefixar o asterisco, diferente da .gitignoresintaxe do arquivo. Por exemplo, em :!*shrinkwrap.yamlvez de :!shrinkwrap.yaml.
Vaughan
7
Excluir mais arquivos, por exemplo, eu tenho os arquivos * .min.css e * .min.js para evitar o diff do git. Então, eu uso o comandogit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare
4
sintaxe janelas : git diff -- . ":(exclude)db/irrelevant.php"(aspas duplas em vez de aspas simples)
cnlevy
4
Obrigado! Uma sintaxe tão esotérica. Eu tenho que procurar sempre.
Daniel Waltrip
1
@cnlevy ou sem aspas! git diff -- . :(exclude)db/irrelevant.php
Matthias
62

Você pode configurar um driver diff personalizado com um comando no op e atribuí-lo aos arquivos que devem ser ignorados.

Crie um driver diff específico do repositório com este comando

git config diff.nodiff.command /bin/true

ou para todos os seus compromissos com --global.

(Se /bin/truenão existir no MacOS, as alternativas seriam usar /usr/bin/trueor echo).

Em seguida, atribua o novo driver diff aos arquivos que você deseja que sejam ignorados no .git/info/attributesarquivo.

irrelevant.php    diff=nodiff

Se este estado é suposto ser compartilhada com outros desenvolvedores que você poderia usar .gitattributesem vez de .git/info/attributese partilhar o git configcomando com seus pares (através de um arquivo de documentação ou algo assim).

KurzedMetal
fonte
2
Isto é exatamente o que eu estava procurando - conforme descrito em kerneltrap.org/mailarchive/git/2008/10/17/3711254 Eu editei ~ / .gitconfig adicionando: [diff "nodiff"] `command = / bin / true` e depois criei um arquivo chamado .git / info / attribute nos quais adicionei: irrelevant.php diff=nodiff
Michael
12
Esta resposta funcionou muito melhor para mim: stackoverflow.com/questions/1016798/…
Neil Forrester
3
Curiosamente, essa abordagem não funciona git diff --stat. Nesse caso, pode-se usar git diff ... | diffstatcomo solução alternativa.
Ddkilzer 6/11
@ Michael esse link parece estar com problemas, existe outro?
DickieBoy
3
apenas uma adição: se você quiser forçar git diff para exibi-lo de qualquer maneira, o uso--no-ext-diff
Florian Klein
35

Você também pode usar filterdiff programa do patchutils coleção programa para excluir algumas partes de um diff. Por exemplo:

git diff | filterdiff -p 1 -x db/irrelevant.php
Szilárd Pfeiffer
fonte
4
Observe que -p, na página de manual (1), é "-pn, --strip-match = n Ao fazer a correspondência, ignore os primeiros n componentes do nome do caminho". Levei um tempo para capturar que -p 1estava removendo a dbparte do caminho do OP. Se você deseja apenas especificar um nome de arquivo e ignorar todas as possibilidades de caminho / diretório, pode usar -p 99.
Tyler Collier
32

Este método é mais curto que as respostas aceitas.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Para mais informações sobre as diferentes possibilidades de inclusão / exclusão, leia este outro post.

Chiel ten Brinke
fonte
Esteja ciente de que o filtro se aplica apenas a todos os arquivos abaixo do diretório atual.
Chiel ten Brinke 23/07/19
Essa foi a melhor resposta. Eu era capaz de simplificá-lo um pouco mais: stackoverflow.com/a/58845608/3886183
dlsso
2
Eu removeria a parte --stat, ou pelo menos explicaria o que ela faz, uma vez que nenhuma das outras respostas a inclui.
mix3d 20/01
O sinalizador stat mostra os arquivos e seus totais diferenciais, o que permite verificar facilmente se o filtro funcionou da maneira que você pretendia.
Chiel ten Brinke em
17

Esta solução de uma linha não requer outros utilitários / downloads:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

Onde file/to/exclude.txtestá o nome do arquivo que você deseja excluir, é claro.

Edit: credit ksenzee por corrigir arquivos excluídos quebrando o diff.

Ben Roux
fonte
Estou tentando adaptar o seu liner git diff --stat mastersem muito sucesso - você poderia ajudar?
Mr_and_Mrs_D
13

Resposta realmente boa do KurzedMetal para o que eu precisava fazer, que era a capacidade de ver que o arquivo foi alterado, mas não de gerar o diff, que poderia ter sido enorme, no meu caso.

Mas um colega meu sugeriu uma abordagem que era ainda mais simples e funcionou para mim:

adicionando .gitattributesarquivo no diretório em que o arquivo a ser ignorado git diffreside com o seguinte conteúdo:

file-not-to-diff.bin -diff

Isso ainda permite git status"ver" se o arquivo foi alterado. git difftambém "verá" que o arquivo foi alterado, mas não gerará o arquivo diff.

Essa .binextensão para o arquivo no exemplo foi deliberada. Percebo que esse é o comportamento padrão do git para arquivos binários e não requer tratamento especial com .gitattributes. Mas, no meu caso, esses arquivos foram reconhecidos como arquivos de texto pelo utilitário git e "file", e isso fez o truque.

user3589608
fonte
11

Resposta mais simples

git diff ':!db/irrelevant.php'

É logo ':!<path to file>'após o seu comando diff. O comando diff pode ser tão complicado quanto você quiser, e você pode usar curingas como *.min.jsou adicionar várias exclusões (o espaço separa os blocos entre aspas), se desejar.

dlsso
fonte
5

Relativo ao diretório raiz do git

git diff aceita uma exclusão opcional

git diff -- ":(exclude)thingToExclude"

Você pode adicionar alguns curingas

git diff -- ":(exclude)*/thingToExclude/*"

Segmente tipos de arquivo específicos

git diff -- ":(exclude)*/$1/*.png"

Ou largue um pequeno script para seus dotfiles

Tais como .bash_profileou.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}
jasonleonhard
fonte
isso simplesmente não funciona para mim, não recebo nenhuma diferença, com ambas as sintaxes, usando (excluir) ou! Eu tenho o git 2.21.0
Olivvv 14/10/19
Você pode git diff em arquivos não faseados ou em etapas. Se você adicionou o git, eles se tornam encenados. Se eles são encenados, você pode fazer git diff --stagedEspero que isso ajude você.
jasonleonhard
Sintaticamente, o que o cólon está fazendo?
Jonah
2

É muito simples, você pode excluir o que deseja usando comandos unix padrão; esses comandos estão disponíveis no git bash, mesmo no ambiente Windows. O exemplo abaixo mostra como excluir o diff para arquivos pom.xml, primeiro verifique o diff para mestre apenas para nomes de arquivos e, em seguida, use 'grep -v' exclua arquivos que você não deseja e depois execute novamente o diff para dominar com lista pré-preparada:

git diff master `git diff --name-only master | grep -v pom.xml`
Nieznany Anonimiec
fonte
1

semelhante à solução de Ben Roux , mas compartilhando de qualquer maneira:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

ou, se as alterações já tiverem sido confirmadas localmente:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Exemplos:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master
Chris Montoro
fonte
1

Eu faço o seguinte:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Sei que não é uma solução elegante e, às vezes, não pode ser usada (por exemplo, se você já possui coisas organizadas), mas faz o truque sem precisar digitar um comando complicado

BlueMagma
fonte
0

Se você quiser fazer isso apenas para inspecionar visualmente o diff, uma ferramenta visual diff (como Meld ) permitirá que você faça isso com um pequeno comando que é fácil de lembrar.

Primeiro, configure uma ferramenta diff, se você ainda não o fez.

$ git config --global diff.tool = meld

Em seguida, você pode executar uma comparação de diretório.

$ git difftool --dir-diff

Você poderá navegar pelas diferenças (por arquivo) no Meld (ou sua ferramenta preferida). Simplesmente não abra o arquivo que deseja ignorar.

mkasberg
fonte