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

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


В принципе, я не хочу видеть измененное содержимое, только имена файлов и номера строк.


person wei    schedule 24.03.2012    source источник
comment
Мне любопытно, действительно ли номера строк полезны без кода? Или вы хотите изменить количество строк?   -  person Andrew Marshall    schedule 24.03.2012
comment
ну, не особо, но мне нужно отметить закладку, где я изменил свой код.   -  person wei    schedule 24.03.2012
comment
Одним из вариантов использования этого может быть объединение информации с отчетом о покрытии кода, чтобы оценить, покрывается ли тестами новый или измененный код в фиксации.   -  person AntonyG    schedule 20.11.2015
comment
@AntonyG Я нашел этот вопрос, пытаясь создать утилиту, которая делает то же самое (покрытие против измененных строк). Вам удалось построить отчет? Если да, то публиковали ли вы это где-нибудь?   -  person Andrew Newdigate    schedule 05.02.2016
comment
@AndrewNewdigate, это был бы классный инструмент, но я никогда его не создавал. Когда я столкнулся с этим вопросом, я занимался другой обработкой результатов покрытия кода, но не смог оправдать время, необходимое для реализации моего предложения.   -  person AntonyG    schedule 05.02.2016
comment
Итак, вы не хотите знать, у каких файлов были изменены имена? Вопрос неоднозначный: /   -  person Max Waterman    schedule 10.07.2020


Ответы (11)


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


Для этого нет встроенной опции (и я не думаю, что это так уж и полезно), но это можно сделать в Git с помощью внешнего скрипта сравнения.

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

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

Подробнее о внешних различиях см. В описании GIT_EXTERNAL_DIFF на странице руководства Git (около строка 700, довольно близко к концу).

person torek    schedule 24.03.2012
comment
Спасибо. На самом деле я написал похожий сценарий, после того как убедился, что для этого нет встроенных опций :) - person wei; 26.03.2012
comment
Подключение к | grep -o '^[0-9]*' дает вам только числа, если вы не заботитесь о правой части. - person GKFX; 13.12.2016
comment
@DylanYoung да; чтобы ограничить количество отображаемых файлов, добавьте --diff-filter=..., где часть ... - это тип изменений, которые вы хотите видеть: M для измененных, A для добавленных, D для удаленных и других согласно git diff документации. - person torek; 17.05.2018
comment
@Sventies: это не то, о чем просил ОП, как я отмечаю в верхней части своего ответа. Ему не нужны одни только имена файлов. Ему нужны имена с номерами строк. - person torek; 14.03.2019
comment
Достаточно честно @torek :) - person Sventies; 15.03.2019

Использовать:

git diff --name-only

Идите вперед и сравните!

person phreakhead    schedule 13.12.2012
comment
Возможно, это ответ, который ищут большинство людей, просматривая эту страницу (это было для меня). Однако он не отвечает на исходный вопрос, в котором конкретно упоминаются номера строк. - person Pieter Müller; 02.12.2013
comment
Это НЕ должен быть принятым ответом, поскольку он решает только половину проблемы - вам все равно нужно вывести, какие строки (для каждого файла) были изменены. - person adamwong246; 24.01.2014
comment
Вот и все! Искал именно этот переключатель! - person Adam Arold; 12.04.2016
comment
Почему бы не использовать git status? Он также сообщает вам о неотслеживаемых файлах. - person Naveen Paul; 14.11.2016
comment
@JimmyPaul, потому что иногда вы уже совершили. Например, вам нужно указать измененный файл между master и вашей текущей расширенной веткой git diff --name-only master..HEAD - person Hettomei; 12.01.2017
comment
Так просто. Почему этот ответ не был отмечен как лучший. Это может сбить с толку людей, которые приходят и не читают ответы после того, как он был отмечен как лучший. - person Yury Bondarau; 15.06.2017
comment
@ PieterMüller Я согласен с вами. Но обычно это работает. Когда вы задаете более одного вопроса за один раз, вы обычно не получаете ответа на все из них. - person Daniel; 06.06.2018
comment
Требуется ли для этого конкретная версия git? У меня не работает передача хэша для сравнения (он просто возвращает инструкции по использованию команды) ... Эта альтернатива сработала для меня: git diff [hash] | grep diff - person poshaughnessy; 28.01.2019
comment
@ PieterMüller Я согласен, это проблематично, потому что я тоже это искал. - person Evan Carroll; 14.06.2020

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

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

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

person ThiefMaster    schedule 24.03.2012
comment
Я думал о реальных номерах строк. Спасибо хоть. - person wei; 24.03.2012
comment
Я почему-то сомневаюсь, что ему нужен инструмент с графическим интерфейсом для этого. - person ThiefMaster; 24.03.2012

Использовать:

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: Странно, что так никто не ответил.

person Seitbekir Seidametov    schedule 24.07.2019
comment
Это не было указано. Работает с версии 2.18, выпущенной год назад. - person Seitbekir Seidametov; 25.07.2019
comment
Идеально. Это сработало для меня, и ответ идеален. - person Victor; 19.03.2020

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
person Feiteira    schedule 18.03.2019

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

git diff --stat <commit-hash>
person masterxilo    schedule 19.11.2018

В 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
person Ger O'Donnell    schedule 05.02.2017

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

git diff-tree --no-commit-id --name-only -r
person RedFred    schedule 02.08.2018

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

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

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/ @@@[ ]\?//}': Удалите @@@[ ]\? из каждой третьей строки, чтобы получить необязательный контекст в 1 строку перед ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Добавляйте \n1 каждые 3 строки между 2-й и 3-й строками для номера столбца.
  4. sed "N;N;N;s/\n/:/g": соединяйте каждые 3 строки с :.
person Edgar Lee    schedule 21.02.2019

Попробуй использовать:

git dif | grep -B <number of before lines to show> <regex>

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

git diff | grep -B 5 dd\(
person user5518501    schedule 19.11.2020

Я использую 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 @@

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

person plhn    schedule 07.02.2020