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