Могу ли я сделать 'git diff' только номера строк и измененные имена файлов?


276

Этот вопрос требует "номеров строк", если вам не нужны номера строк в выходных данных, посмотрите этот вопрос и ответ .


По сути, я не хочу видеть измененный контент, только имена файлов и номера строк.


Мне интересно, действительно ли номера строк полезны без кода? Или вы хотите, чтобы количество строк изменилось?
— Эндрю Маршалл

ну, не особенно, но мне нужно, чтобы в закладки, где я изменил свой код.
— Вэй

1
Одним из вариантов использования этого было бы объединить информацию с отчетом о покрытии кода, чтобы оценить, покрыты ли тесты новым или измененным кодом в
— коммите

@AntonyG Я нашел этот вопрос, пытаясь создать утилиту, которая делает то же самое (покрытие против измененных строк). Вам удалось построить отчет? Если так, вы публиковали это где-нибудь?
— Эндрю Ньюдигейт

@AndrewNewdigate это был бы классный инструмент, но я никогда не создавал его. Когда я натолкнулся на этот вопрос, я занимался какой-то другой обработкой результатов покрытия кода, но не смог оправдать время, необходимое для реализации моего предложения
— AntonyG

Ответы:


70

Примечание: если вы просто ищете имена измененных файлов ( без с номерами строк для строк , которые были изменены), что это легко, нажмите на эту ссылку на другой ответ здесь .


Там нет встроенной опции для этого (и я не думаю , что это все , что полезно либо), но это можно сделать в мерзавец, с помощью «внешнего дифф» сценарий.

Вот довольно дрянной; это будет зависеть от вас, чтобы исправить вывод так, как вы хотели бы.

#! /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 '^[<>-]'

Подробнее о "external diff" смотрите в описании GIT_EXTERNAL_DIFFна странице руководства git (около строки 700, довольно близко к концу).


1
Спасибо. Я на самом деле написал аналогичный сценарий, после того как подтвердил, что для этого нет встроенных опций :)
— Вэй

Трубопровод | grep -o '^[0-9]*'дает только цифры, если вы не заботитесь о правой стороне.
— GKFX

1
@DylanYoung да; чтобы ограничить количество отображаемых файлов, добавьте, --diff-filter=...где ...часть - это вид изменений, которые вы хотите увидеть: Mдля измененных, Aдля добавленных, Dдля удаленных и другие в git diffдокументации.
— Торек

@ Sventies: это не то, о чем просил ФП, как я отмечаю в верхней части моего ответа. Он не хочет имен файлов в одиночку. Он хочет имена с номерами строк .
— Торек

Достаточно справедливо @torek :)
— Sventies

833

Так легко:

git diff --name-only

Иди и отличайся!


88
Это возможно ответ, который ищет большинство людей, когда они просматривают эту страницу (это было для меня). Тем не менее, он не отвечает на оригинальный вопрос, который конкретно упоминает номера строк.
— Питер Мюллер

12
Это НЕ должен быть принятый ответ, так как он решает только половину проблемы - вам все равно нужно вывести, какие строки (для каждого файла) были изменены.
— adamwong246

Это оно! Я искал именно этот переключатель!
— Адам Арольд

Почему бы не использовать «git status»? Он также сообщает вам неотслеживаемые файлы.
— Навин Пол

1
@JimmyPaul, потому что иногда вы уже сделали коммит. Например, вам нужно перечислить измененный файл между мастером и вашей текущей расширенной веткойgit diff --name-only master..HEAD
— Hettomei

68

Номера строк, такие как количество измененных строк или фактические номера строк, содержащие изменения? Если вы хотите количество измененных строк, используйте git diff --stat. Это дает вам такой дисплей:

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

Нет возможности получить номера строк самих изменений.


1
Я думал о реальных номерах строк. Спасибо хоть.
— Вэй

Я почему-то сомневаюсь, что он хочет инструмент GUI для этого.
— ThiefMaster

31

git diff master --compact-summary

Выход:

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

Это именно то, что вам нужно. Тот же формат, что и при выполнении коммита или получении новых коммитов с пульта.

PS: Это связано с тем, что никто так не ответил.


1
Это не было указано. Работает с версии 2.18, выпущенной год назад.
— Сейтбекир Сеидаметов

Отлично. Это сработало для меня, и ответ является идеальным.
— Виктор

15

1) Мой любимый:

git diff --name-status

Зависит от статуса файла, например:

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

2) Если вам нужна статистика, то:

git diff --stat

покажет что-то вроде:

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

3) Наконец, если вы действительно хотите только имена файлов:

git diff --name-only

Просто покажет:

new_file.txt
modified_file.txt
deleted_file

4

Показывает имена файлов и количество / количество строк, которые изменились в каждом файле с настоящего момента до указанной фиксации:

git diff --stat <commit-hash>

2

Я знаю, что это старый вопрос, но в Windows это фильтрует вывод git в файлы и изменяет номера строк:

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

Извлечь файлы и измененные строки из этого немного больше:

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

Самый чистый вывод, то есть только имена файлов / пути, идет с

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

НТН


0

На git version 2.17.1, нет встроенного флага для достижения этой цели.

Вот пример команды для фильтрации имени файла и номеров строк из унифицированного diff:

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

Например, унифицированный diff:

$ 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

Приведет к:

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

Чтобы сопоставить вывод команд в общих результатах сопоставления 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]+)? ): Совпадение имени файла с diff --cc <filename>ИЛИ совпадение номера строки с @@@ <from-file-range> <from-file-range> <to-file-range>ИЛИ совпадение оставшегося текста после @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Удалить @@@[ ]\?из каждой 3-й строки, чтобы получить дополнительный 1-строчный контекст раньше ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Добавьте \n1каждые 3 строки между 2-й и 3-й строкой для номера столбца.
  4. sed "N;N;N;s/\n/:/g": Соединяйте каждые 3 строки с :.

0

Я использую grepкак наивное решение.

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

пример вывода:

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

Может быть, вы можете увидеть цветной вывод. Это поможет вам легко прочитать результаты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.