Filtrar git diff por tipo de mudança


114

Existe uma maneira de limitar os git diffarquivos alterados?

Eu gostaria de ver as diferenças entre dois commits, mas excluir caminhos que não existem em um ou no outro (adições / exclusões). O seguinte one-liner do Perl ilustra muito do que eu quero:

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'

Mas isso deixa diff --git a/path b/pathlinhas para os arquivos novos ou excluídos. Além disso, seria muito melhor se eu não tivesse que analisar (também falha se algum pedaço contiver algo que corresponda a / ^ diff /, por exemplo).

Outra alternativa que tentei foi:

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --

Sua saída é melhor, mas ainda parece hackear.

Respostas:


202

Você está procurando --diff-filter=Mmostrar apenas os arquivos * M * odificados entre os dois ramos.

De man git-diff

--diff-filter=[ACDMRTUXB*]

Selecione apenas os arquivos que são

  • A Adicionado
  • C Copiado
  • D Excluído
  • M Modificado
  • R Renomeado
  • T ter seu tipo (modo) alterado
  • U Não mesclado
  • X Desconhecido
  • B tiveram seu emparelhamento quebrado
  • * Tudo ou nada

Qualquer combinação dos caracteres do filtro 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 nenhum arquivo que corresponda a outros critérios, nada será selecionado.


Por favor, evite um erro estúpido meu ao usar --diff-filter = AMR para omitir arquivos deletados: Se você está removendo um arquivo 'x' então git diff HEAD HEAD ~ 1 --name-only --diff-filter = AMR irá ainda lista 'x'. Por quê? Porque de HEAD em direção a HEAD ~ 1, o arquivo foi adicionado, não removido.
Christoph Grimmer-Dietrich

2
A descrição de T é confusa. De man git diff"ter seu tipo (ou seja, arquivo regular, link simbólico, submódulo, ...) alterado (T),"
grimsock

Se você quiser usar R(arquivos renomeados), você precisa usar o -Mexpandido, é conhecido como--find-renames
ccjjmartin

onde esses diferentes tipos estão documentados? basicamente, A, D, M, T e R são diretos. Adoraria saber o que C, U, X e B implicam.
DanCat

Nice e outra resposta apontam que minúsculas significa exclusão. Muito útil para excluir arquivos excluídos.
Philippe Rathé

18

Como o Git 2.10 (Q3 2016) nos lembrará, existe uma maneira mais fácil de "mostrar tudo, exceto arquivos adicionados / excluídos". (na verdade, desde Git 1.8.5, julho de 2013)

 git diff --diff-filter=ad master..

Veja o commit 16726cf (14 de julho de 2016) de Junio ​​C Hamano ( gitster) .
(Incorporado por Junio ​​C Hamano - gitster- no commit 2f8c654 , 08 de agosto de 2016)

diff: diff-filterexclusão de documento

Nos dias v1.8.5, 7f2ea5f ( diff: permitir que a letra minúscula especifique qual classe de mudança excluir, 2013-07-17) ensinou o --diff-filtermecanismo " " a aceitar letras minúsculas como exclusão , mas esquecemos de documentá-lo.

Portanto, a documentação sobrediff-options agora (finalmente) inclui:

Essas letras maiúsculas podem ser reduzidas para exclusão.
Por exemplo, --diff-filter=adexclui caminhos adicionados e excluídos.


4

Você pode usar o sinalizador --diff-filter para fazer exatamente isso. git diff --diff-filter=CMRTUXB master..deve mostrar tudo, exceto arquivos adicionados / excluídos.


3

Para ver todos os arquivos modificados e novos que você pode usar

git diff --name-only --diff-filter=ACMR PREV_VERSION master

PREV_VERSION é o hash de seu primeiro commit.

Para obter uma exportação como zip, você pode usar este código

git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)

Nota: .gitignorenão está emexport.zip


0

Usei o Notepad ++ (Windows) e essas expressões regulares para filtrar tipos de extensão e certos caminhos de um arquivo diff.

^Index.*\.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[\s\S.]*?^Index
^Index: Shared/.+$[\s\S.]*?^Index
^Index: Next/source/Utility/.+$[\s\S.]*?^Index

O único problema é, quando chega ao fim. Você tem que 'ctrl + home' e ir novamente até que não encontre nada.

(Substitua o que for encontrado por 'Índice')

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.