'Git diff' i yalnızca satır numaralarını VE değiştirilmiş dosya adlarını yapabilir miyim?


276

Bu soru "satır numaraları" için çağrı yapar, eğer çıkıştaki satır numaraları ile ilgilenmezseniz bu soruya ve cevaba bakınız .


Temel olarak, değiştirilen içeriği görmek istemiyorum, sadece dosya adlarını ve satır numaralarını.


Merak ediyorum, satır numaraları kod olmadan gerçekten kullanışlı mı? Yoksa satır sayısının değişmesini mi istiyorsunuz?
— Andrew Marshall

iyi, özellikle değil, ama benim kod değiştirdi yer imi gerekir.
— wei

1
Bunun bir kullanımı, bilgiyi bir kod kapsamı raporu ile birleştirmek, bir taahhütteki yeni veya değiştirilmiş kodun testlerle
— kapsanıp

@AntonyG Bu soruyu tamamen aynı şeyi yapan bir yardımcı program oluşturmaya çalışırken buldum (kapsama alanı, değişen satırlara göre). Raporu oluşturmayı başardınız mı? Öyleyse, herhangi bir yerde yayınladınız mı?
— Andrew Newdigate

@AndrewNewdigate harika bir araç olurdu ama asla yapmadım. Bu soruyla karşılaştığımda başka bir tür kod kapsamı sonuçları işleme yapıyordum, ancak öneriyi uygulamak için gereken zamanı haklı çıkaramadım
— AntonyG

Yanıtlar:


70

Not: eğer sadece isim arayan (değiştirilen dosyaların olmadan hat numaraları değiştirildi hatları için), kolay, burada başka bir cevap için bu bağlantıyı tıklayın .


Hiçbir Bunun seçeneği-yerleşik (ve hepsi ya kullanışlı olduğunu sanmıyorum) ama olan bir "dış fark" komut yardımıyla, GIT'de bunu yapmak mümkün.

İşte oldukça berbat biri; çıktıyı istediğiniz şekilde düzeltmek size kalmış.

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

"Dış fark" ile ilgili detaylar GIT_EXTERNAL_DIFFiçin git kılavuz sayfasındaki (700. satır civarında, sonuna oldukça yakın) açıklamasına bakınız.


1
Teşekkürler. Aslında, bunun için yerleşik bir seçenek olmadığını doğruladıktan sonra benzer bir senaryo yazdım :)
— wei

Boru tesisatı | grep -o '^[0-9]*', sağ tarafı önemsemediğinizi varsayarak size sadece rakamlar verir.
— GKFX

1
@DylanYoung evet; gösterilen dosyaları sınırlamak için --diff-filter=..., ...parçanın görmek istediğiniz değişiklik türü olduğu yere ekleyin : Mdeğiştirilenler Aiçin, eklenenler Diçin, silinenler ve git diffbelgeler için diğerleri .
— torek

@Sventies: Cevabımın en üstünde not ettiğim gibi OP'nin istediği bu değil. Sadece dosyaların isimlerini istemiyor . Satır numaraları olan isimleri istiyor .
— torek

Yeterince adil @torek :)
— Sventies

832

Çok kolay:

git diff --name-only

İleri git ve fark!


88
Bu, çoğu kişinin bu sayfayı görüntülediğinde aradığı cevaptır (bu benim için). Ancak, özellikle satır numaralarından bahseden orijinal soruya cevap vermez.
— Pieter Müller

12
Sorunun sadece yarısını çözdüğü için kabul edilen cevap OLMAMALIDIR - değiştirilen satırların (her dosya için) çıktısını almanız gerekir.
— adamwong246

Bu kadar! Bu anahtarı tam olarak arıyordum!
— Adam Arold

Neden "git status" kullanmıyorsunuz? Ayrıca izlenmeyen dosyaları da söyler.
— Naveen Paul

1
@JimmyPaul çünkü bazen zaten taahhüt etmişsinizdir. Örneğin, master ile mevcut gelişmiş git diff --name-only master..HEAD
— dalınız

68

Değiştirilen satır sayısı gibi satır numaraları veya değişiklikleri içeren gerçek satır numaraları? Değiştirilen satır sayısını istiyorsanız kullanın git diff --stat. Bu size şöyle bir ekran verir:

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

Değişikliklerin satır numaralarını alma seçeneği yoktur.


1
Asıl satır numaralarını düşünüyordum. Yine de teşekkürler.
— wei

Bir şekilde bunun için bir GUI aracı istediğinden şüpheliyim.
— ThiefMaster

30

git diff master --compact-summary

Çıktı:

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

Tam da ihtiyacınız olan şey bu. Taahhüt yaparken veya uzaktan kumandadan yeni taahhütler çekerken kullandığınız format.

PS: Kimsenin bu şekilde cevap vermemesi çok kablolu.


1
Bu belirtilmedi. Yıl önce piyasaya sürülen 2.18'den beri çalışıyor.
— Seitbekir Seidametov

Mükemmel. Bu benim için çalıştı ve cevap mükemmel.
— Victor

15

1) Benim favorim:

git diff --name-status

Dosya durumunu öneriyor, örneğin:

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

2) İstatistik istiyorsanız, o zaman:

git diff --stat

şöyle bir şey gösterecek:

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

3) Son olarak, gerçekten sadece dosya adlarını istiyorsanız:

git diff --name-only

Basitçe göstereceğim:

new_file.txt
modified_file.txt
deleted_file

4

Şimdi ile belirtilen işlem arasında her dosyada değişen dosya adlarını ve satır miktarını / nubmer'ını gösterir:

git diff --stat <commit-hash>

2

Bunun eski bir soru olduğunu biliyorum, ancak Windows'ta bu, git çıkışını dosyalara filtreledi ve satır numaralarını değiştirdi:

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

Dosyaları ve değiştirilen satırları buradan çıkarmak biraz daha fazla iştir:

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

En temiz çıktı, yani yalnızca dosya adları / yolları,

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

HTH


0

Tarihinde git version 2.17.1, bu amaca ulaşmak için yerleşik bir bayrak yoktur .

Birleştirilmiş bir farktan dosya adını ve satır numaralarını filtrelemek için örnek bir komut aşağıdadır:

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

Örneğin, birleşik fark:

$ 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

Sonuçlanacak:

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

Ortak grep eşleme sonuçlarındaki komutların çıktısını eşleştirmek için:

$ 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]+)? ): OR'den dosya adını diff --cc <filename>eşleştir VEYA'dan satır numarasını @@@ <from-file-range> <from-file-range> <to-file-range>eşleştir Sonra kalan metni eşleştir @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Daha @@@[ ]\?önce isteğe bağlı 1 satır bağlamını elde etmek için her 3 satırdan birini kaldırın ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Ekle \n1 Sütun numarası için 2. ve 3. satır arasına her 3 satırdan birini .
  4. sed "N;N;N;s/\n/:/g": Her 3 satıra bir ile katılın :.

0

grepSaf bir çözüm olarak kullanıyorum .

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

bir çıktı örneği:

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

Belki renkli bir çıktı görebilirsiniz. Çıktıları kolayca okumanıza yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.