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