Могу ли я сделать '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.