Чи можу я зробити "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 '^[<>-]'

Детальніше про "зовнішню різницю" див. Опис GIT_EXTERNAL_DIFFна сторінці посібника з git (близько рядка 700, досить близько до кінця).


1
Дякую. Я фактично написав подібний сценарій, після того, як підтвердив, що для цього немає вбудованих варіантів :)
— wei

Проведення конвеєра | grep -o '^[0-9]*'дає просто цифри, якщо ви не переймаєтесь правою стороною.
— GKFX

1
@DylanYoung так; щоб обмежити показані файли, додайте --diff-filter=...там, де ...частина - тип змін, який ви хочете бачити: Mдля модифікованих, Aдоданих, Dвидалених та інших в git diffдокументації.
— торек

@Sventies: це не те, про що просив ОП, як я зазначаю у верхній частині своєї відповіді. Він не хоче самостійно називати файли. Він хоче імена з номерами рядків .
— Торека

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

831

Так легко:

git diff --name-only

Іди і різнися!


88
Це можлива відповідь, яку більшість людей шукає, переглядаючи цю сторінку (це було для мене). Однак він не відповідає на початкове запитання, в якому конкретно згадуються номери рядків.
— Пітер Мюллер

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

Це воно! Я саме шукав цей перемикач!
— Адам Арольд

Чому б не використовувати "git status"? Він також повідомляє вам, що відслідковуються файли.
— Naveen Paul

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

30

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, випущеним рік тому.
— Seitbekir Seidametov

Ідеально. Це працювало для мене, і реакція ідеальна.
— Віктор

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

HTH


0

Увімкнено 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':'

Наприклад, уніфікований розл .:

$ 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.