diff para mostrar apenas as adições em um arquivo alterado

3

Normalmente, diff e git diff mostram a linha original e a modificada com - e + , respectivamente. Existe alguma maneira, eu posso filtrar apenas para ver a linha modificada? Isso reduziria o número de linhas a serem lidas por um fator de 2 instantaneamente.

Eu estava assumindo

git diff test.yml | grep '^+' | less -R

e

git diff test.yml | egrep '^+' | less -R

para ter o mesmo resultado. ou seja, eles mostrariam novas adições em um arquivo. No entanto egrep mostra o arquivo inteiro. Por que isso acontece?

Com o método acima, de qualquer maneira, eu perco a cor. Existe alguma maneira de manter a cor?

    
por infoclogged 14.09.2017 / 13:34

5 respostas

2

Você pode usar --word-diff para condensar as linhas + e - juntamente com as alterações destacadas usando texto vermelho / verde e parar de usar o grep todas juntas.

Vocêpodecombinarissocom-U0pararemovertodoocontextoemtornodosdiffssevocêrealmentequisercondensá-loaindamais.

Estaabordagemémelhordoqueusarogrepjáquevocênãoperdeasaída,vocêpodedizerquandoumalinhafoiadicionadaousimplesmentealteradaevocênãoperdecompletamenteasremoçõesenquantoaindacondensandoasaídaemalgoqueéfácildeler.

Arespostaàperguntasobreoegrepjáfoirespondidapelo@StephenKitt aqui

    
por 14.09.2017 / 14:04
2

egrep usa expressões regulares estendidas, então

egrep ^+

corresponde a um ou mais começos de linhas ( + é um caractere especial aqui). Para combinar com o caractere "+", você precisa escapar:

egrep ^\+

Para ver as cores, você precisa forçar git a gerá-las; por padrão, desabilita-os quando está trabalhando:

git diff --color

Para filtrar isso, você precisa considerar os códigos de escape usados para as cores:

git diff --color ... | egrep '^.[[[:digit:]]+m\+' | less -R
    
por 14.09.2017 / 13:55
1

However egrep shows me the entire file. Why is that so?

Como egrep usa expressões regulares estendidas, por isso egrep ^+ corresponde ao início de cada linha uma ou mais vezes (ou seja, corresponde a todas as linhas). Use egrep ^\+ para corresponder apenas às linhas que começam com + .

With the above method anyways, I lose the color. Is there any way to retain the color?

Sim, adicione a opção --color=always :

git diff --color=always | less -R
    
por 14.09.2017 / 13:53
1

Ao usar grep funciona, você pode usar um sinalizador para obter resultados semelhantes e possivelmente mais sucintos.

git diff

Você pode ajustar a quantidade de contexto que o git diff fornece com o sinalizador -U . De man git-diff :

   -U<n>, --unified=<n>
       Generate diffs with <n> lines of context instead of the usual three. Implies -p.

git diff -U0 produzirá saída mínima / simples sem contexto para cada alteração.

diff

O mesmo sinalizador se aplica a diff :

   -u  -U NUM  --unified[=NUM]
          Output NUM (default 3) lines of unified context.

Exemplo ( diff -U0 funcionaria da mesma forma):

$ diff -U0 <(echo -e "abc123\ndef345") <(echo -e "abc123\nghi678")
--- /dev/fd/63  2017-09-14 09:18:01.000000000 -0400
+++ /dev/fd/62  2017-09-14 09:18:01.000000000 -0400
@@ -2 +2 @@
-def345
+ghi678
    
por 14.09.2017 / 14:59
0

Também pode ser feito com grep sozinho.

$ grep -xvFf filea.txt fileb.txt

Isso pega as linhas de um arquivo e as procura no outro, imprimindo apenas aquelas que não combinam exatamente.

    
por 24.09.2018 / 05:51

Tags