क्या मैं केवल लाइन नंबर और परिवर्तित फ़ाइल नामों के लिए 'git diff' बना सकता हूं?


276

यह प्रश्न "लाइन नंबरों" के लिए कहता है, यदि आप आउटपुट में लाइन नंबरों की परवाह नहीं करते हैं तो यह प्रश्न और उत्तर देखें


मूल रूप से, मैं परिवर्तित सामग्री नहीं देखना चाहता, बस फ़ाइल नाम और लाइन नंबर।


मैं उत्सुक हूँ, क्या लाइन नंबर वास्तव में बिना कोड के उपयोगी हैं? या आप लाइनों की संख्या को बदलना चाहते हैं?
एंड्रयू मार्शल

खैर, विशेष रूप से नहीं, लेकिन मुझे इसे बुकमार्क करने की आवश्यकता है जहां मैंने अपना कोड बदल दिया है।
मारी

1
इसका एक उपयोग कोड कवरेज रिपोर्ट के साथ जानकारी को संयोजित करने के लिए होगा, यह आकलन करने के लिए कि क्या प्रतिबद्ध में नया या संशोधित कोड परीक्षणों द्वारा कवर किया गया है
एंटोनीजी

@AntonyG मुझे एक उपयोगिता बनाने की कोशिश करते हुए यह प्रश्न मिला जो बिल्कुल एक ही काम करता है (कवरेज बनाम परिवर्तित लाइनें)। क्या आपने रिपोर्ट बनाने का प्रबंधन किया? यदि हां, तो क्या आपने इसे कहीं भी प्रकाशित किया है?
एंड्रयू न्यूडेज

@AndrewNewdigate यह एक अच्छा उपकरण होगा लेकिन मैंने इसे कभी नहीं बनाया। जब मैं इस प्रश्न पर आया तो मैं कुछ अन्य प्रकार के कोड कवरेज परिणाम प्रसंस्करण कर रहा था, लेकिन अपने सुझाव को लागू करने के लिए आवश्यक समय का औचित्य नहीं बता सकता था
AntonyG

जवाबों:


70

नोट: यदि आप कर रहे हैं बस नाम की तलाश में (बदल फ़ाइलों के बिना लाइन नंबर लाइनों के लिए कि बदल रहे थे), आसान है कि, एक और उत्तर यहाँ करने के लिए इस लिंक पर क्लिक करें


कोई अंतर्निहित है इस के लिए विकल्प (और मुझे नहीं लगता कि यह सब या तो उपयोगी है कि है), लेकिन यह है एक "बाहरी diff" स्क्रिप्ट की मदद से Git में ऐसा करने के लिए, संभव।

यहाँ एक बहुत भद्दा है; यह आप पर निर्भर करेगा कि आप आउटपुट को उस तरह से ठीक कर सकते हैं जैसा आप चाहते हैं।

#! /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लिए गिट मैनुअल पेज (लगभग 700 के आसपास, अंत के बहुत करीब) का विवरण देखें।


1
धन्यवाद। मैंने वास्तव में एक समान स्क्रिप्ट लिखी है, जिसकी पुष्टि होने के बाद कि इसके लिए कोई निर्मित विकल्प नहीं है, :)
wei

पाइपिंग | grep -o '^[0-9]*'आपको केवल नंबर देता है, यह मानते हुए कि आप दाहिने हाथ की ओर ध्यान नहीं देते हैं।
GKFX

1
@DylanYoung हाँ; पता चला फ़ाइलों को सीमित करने, जोड़ने --diff-filter=...जहां ...हिस्सा परिवर्तन आप देखना चाहते हैं की तरह है: Mसंशोधित के लिए, Aने कहा, के लिए Dके लिए नष्ट कर दिया, और दूसरों के प्रति git diffप्रलेखन।
torek

@ सत्तर: ओपी ने जो पूछा, वैसा नहीं है, जैसा कि मैं अपने जवाब के शीर्ष पर ध्यान देता हूं। वह अकेले फाइलों के नाम नहीं चाहता । वह लाइन नंबरों के साथ नाम चाहते हैं ।
torek

मेला काफी @torek :)
Sventies

831

इतना आसान:

git diff --name-only

आगे बढ़ो और अंतर करो!


88
यह संभव है कि अधिकांश लोग इस पृष्ठ को देखने के लिए खोज रहे हैं (यह मेरे लिए था)। हालांकि, यह मूल प्रश्न का उत्तर नहीं देता है, जो विशेष रूप से लाइन संख्या का उल्लेख करता है।
पीटर मूलर

12
यह स्वीकृत उत्तर नहीं होना चाहिए क्योंकि यह केवल आधी समस्या को हल करता है- आपको अभी भी आउटपुट की जरूरत है कि कौन सी लाइनें (प्रत्येक फ़ाइल के लिए) जो बदल दी गई थीं।
adamwong246

बस! मैं इस स्विच की तलाश में था!
एडम एरॉल्ड

क्यों नहीं "गिट स्थिति" का उपयोग करें? यह आपको अनट्रेक्टेड फाइल्स भी बताता है।
नवीन पॉल

1
@JimmyPaul क्योंकि कभी-कभी आप पहले से ही कमिटेड हैं। उदाहरण के लिए आपको मास्टर और अपनी वर्तमान उन्नत शाखा के बीच परिवर्तित फ़ाइल को सूचीबद्ध करने की आवश्यकता हैgit diff --name-only master..HEAD
हेमट्टी

68

बदली गई रेखाओं की संख्या या वास्तविक संख्या वाली रेखाएँ जिनमें परिवर्तन होते हैं? यदि आप परिवर्तित लाइनों की संख्या चाहते हैं, तो उपयोग करें git diff --stat। यह आपको इस तरह से एक डिस्प्ले देता है:

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

परिवर्तनों की पंक्ति संख्या स्वयं प्राप्त करने का कोई विकल्प नहीं है।


1
मैं वास्तविक लाइन संख्या सोच रहा था। हालांकि धन्यवाद।
वी

मुझे किसी तरह संदेह है कि वह इसके लिए एक जीयूआई उपकरण चाहता है।
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 से काम करता है।
सीतबकीर सीदामेतोव

उत्तम। यह मेरे लिए काम किया और प्रतिक्रिया एकदम सही है।
विक्टर

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

मुझे पता है कि यह एक पुराना सवाल है लेकिन विंडोज पर, यह फाइल और बदले हुए लाइन नंबरों के लिए 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/ @@@[ ]\?//}': @@@[ ]\?वैकल्पिक 1 लाइन संदर्भ प्राप्त करने के लिए हर 3 लाइन से पहले निकालें ++<<<<<<< HEAD
  3. sed '2~3 s/$/\n1/g': \n1कॉलम नंबर के लिए 2 और 3 लाइन के बीच हर 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.