Posso fazer 'git diff' apenas os números das linhas E os nomes dos arquivos alterados?


276

Esta pergunta exige "números de linha". Se você não se importa com os números de linha na saída, consulte esta pergunta e resposta .


Basicamente, não quero ver o conteúdo alterado, apenas os nomes dos arquivos e os números de linha.


Estou curioso, os números de linha são realmente úteis sem código? Ou você quer que o número de linhas seja alterado?
Andrew Marshall

bem, não particularmente, mas preciso marcar como favorito onde mudei meu código.
24512 wei

1
Um uso disto seria combinar a informação com um relatório de cobertura de código, para avaliar se o código novo ou modificado em um commit é coberto por testes
AntonyG

@AntonyG Encontrei essa pergunta ao tentar criar um utilitário que faz exatamente a mesma coisa (cobertura versus linhas alteradas). Você conseguiu criar o relatório? Em caso afirmativo, você publicou em algum lugar?
Andrew Newdigate

@AndrewNewdigate seria uma ferramenta interessante, mas eu nunca a construí. Eu estava fazendo algum outro tipo de código de resultados de cobertura de processamento quando me deparei com esta questão, mas não poderia justificar o tempo necessário para implementar a minha sugestão
AntonyG

Respostas:


70

Nota: se você está apenas procurando os nomes dos arquivos alterados ( sem os números das linhas que foram alteradas), é fácil, clique neste link para outra resposta aqui .


Não existe uma opção embutida para isso (e também não acho útil), mas é possível fazer isso no git, com a ajuda de um script "diff externo".

Aqui está um pouco ruim; caberá a você corrigir a saída da maneira que deseja.

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

Para detalhes sobre "diff externo", veja a descrição GIT_EXTERNAL_DIFFna página de manual do git (em torno da linha 700, bem perto do fim).


1
Obrigado. Na verdade, eu escrevi um script semelhante, depois de ter sido confirmado que não há é built-in opções para isso, :)
wei

A canalização para | grep -o '^[0-9]*'fornece apenas números, supondo que você não se importe com o lado direito.
GKFX

1
@DylanYoung yes; para limitar os arquivos mostrados, adicione --diff-filter=...onde a ...peça é o tipo de alteração que você deseja ver: Mpara modificado, Aadicionado, Dexcluído e outros, conforme a git diffdocumentação.
Torek 17/05/19

@ Seventies: não é isso que o OP pediu, como observo no topo da minha resposta. Ele não quer os nomes dos arquivos sozinhos. Ele quer os nomes com números de linha .
torek 14/03/19

@Torek suficiente Fair :)
Sventies

833

Tão fácil:

git diff --name-only

Vá em frente e diff!


88
Esta é possível a resposta que a maioria das pessoas procura quando visualiza esta página (era para mim). No entanto, ele não responde à pergunta original, que menciona especificamente os números de linha.
Pieter Müller

12
Essa NÃO deve ser a resposta aceita, pois resolve apenas metade do problema - você ainda precisa gerar as linhas (para cada arquivo) que foram alteradas.
precisa saber é o seguinte

É isso aí! Eu estava procurando exatamente essa opção!
Adam Arold

Por que não usar "status git"? Também informa os arquivos não rastreados.
Naveen Paul

1
@ JimmyPaul porque às vezes você já se comprometeu. Por exemplo, você precisa lista mudou ficheiro entre o mestre e seu atual ramo avançadogit diff --name-only master..HEAD
Hettomei

68

Números de linha como no número de linhas alteradas ou nos números de linha reais que contêm as alterações? Se você deseja o número de linhas alteradas, use git diff --stat. Isso fornece uma exibição como esta:

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

Não há opção para obter os números das linhas das alterações.


1
Eu estava pensando nos números de linha reais. Obrigado embora.
24512 wei

De alguma forma, duvido que ele queira uma ferramenta GUI para isso.
ThiefMaster 24/03/12

30

git diff master --compact-summary

A saída é:

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

É exatamente isso que você precisa. Mesmo formato que quando você faz commit ou obtém novos commit do controle remoto.

PS: Isso significa que ninguém respondeu dessa maneira.


1
Isso não foi especificado. Ele funciona a partir de 2.18 lançado ano atrás.
Seitbekir Seidametov 25/07/19

Perfeito. Isso funcionou para mim e a resposta é perfeita.
Victor

15

1) O meu favorito:

git diff --name-status

Anexa o status do arquivo, por exemplo:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2) Se você deseja estatísticas, então:

git diff --stat

mostrará algo como:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3) Finalmente, se você realmente deseja apenas os nomes de arquivos:

git diff --name-only

Mostrará simplesmente:

new_file.txt
modified_file.txt
deleted_file

4

Mostra os nomes dos arquivos e a quantidade / número de linhas que foram alteradas em cada arquivo entre agora e a confirmação especificada:

git diff --stat <commit-hash>

2

Eu sei que essa é uma pergunta antiga, mas no Windows, isso filtra a saída do git para os arquivos e altera os números de linha:

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

Para extrair os arquivos e as linhas alteradas, é um pouco mais trabalhoso:

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7

1

A saída mais limpa, ou seja, apenas nomes de arquivo / caminhos, vem com

git diff-tree --no-commit-id --name-only -r

HTH


0

Ativado git version 2.17.1, não há um sinalizador interno para atingir esse objetivo.

Aqui está um comando de exemplo para filtrar o nome do arquivo e os números de linha de um diff unificado:

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

Por exemplo, o diff unificado:

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

Vai resultar em:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

Para corresponder à saída de comandos em resultados comuns de correspondência grep:

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ): Corresponde ao nome do arquivo de diff --cc <filename>OU Corresponde ao número da linha de @@@ <from-file-range> <from-file-range> <to-file-range>OU Corresponde ao texto restante depois @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Remova @@@[ ]\?de cada terceira linha para obter o contexto opcional de 1 linha antes ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Adicione a \n1cada 3 linhas entre a 2ª e a 3ª linha para o número da coluna.
  4. sed "N;N;N;s/\n/:/g": Junte a cada 3 linhas com a :.

0

Eu uso grepcomo uma solução ingênua.

$ git diff | grep -A2 -- '---'

um exemplo de saída:

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

Talvez você possa ver uma saída colorida. Ajuda você a ler facilmente as saídas.

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.