फ़ाइल एक्सटेंशन के आधार पर गिट भिन्न को कैसे फ़िल्टर किया जाए?


152

क्या git diffफ़ाइल एक्सटेंशन के दिए गए सेट पर प्रतिबंध लगाने का विकल्प है ?

जवाबों:


227

हां, यदि आप यह सुनिश्चित करते हैं कि git आपके शेल के बजाय एक ग्लोब का विस्तार करता है तो यह किसी भी स्तर पर मेल खाएगा इसलिए ऐसा कुछ (उद्धरण महत्वपूर्ण है) ठीक काम करना चाहिए।

git diff -- '*.c' '*.h'

1
ठीक है, मेरा गिट संस्करण बहुत पुराना था। 1.7.8 के साथ विज्ञापित के रूप में काम करता है। अति उत्कृष्ट।
Mat

3
मेरा ब्रेस विस्तार के साथ काम किया, एक लाgit diff -- *.{c,h,etc}
मैट फ्लेचर 16

9
डबल डैश महत्वपूर्ण है। git diff master HEAD -- "*filename.txt"उपयोगी भी हैgit diff master HEAD --name-only
neaumusic

एकल उद्धरण ( '') भी महत्वपूर्ण हैं! git diff -- src/*.jsहोना चाहिएgit diff -- 'src/*.js'
निकोफिथ

1
यह भी गिट रिपॉजिटरी के रूट डायरेक्टरी में करना चाहिए।
जॉन जियांग

10

फ़ाइलों को पुनरावर्ती रूप से शामिल करने के लिए (वर्तमान dir सहित) इसने मेरे लिए काम किया:

git diff -- '***.py'

1
मेरे लिए यह सबसे अच्छा उपाय है। आप कुछ फ़ाइलों / निर्देशिकाओं को भी बाहर कर सकते हैं। उदाहरण के लिए:git diff -- '***.py' ':!.Trashes'
बार्टोज़

ट्रिपल तारांकन क्या करते हैं (एकल तारांकन की तुलना में)?
जन्नत पोपिंग जूल

IIRC डबल तारांकन का अर्थ है (संभवतः) नेस्टेड निर्देशिका (यहां तक ​​कि खाली) और एकल तारांकन और .py फ़ाइल नाम का अर्थ है। तो यह वर्तमान या किसी भी नेस्टेड निर्देशिका में एक * .py फ़ाइल होनी चाहिए।
बोहुमीर ज़मेकनिक

8

या तो अपने शेल के ग्लोबस्टार का उपयोग करें (जो एक पुनरावर्ती खोज करता है) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

या उपयोग खोजें:

find -name '*.py' -print0 | xargs -0 git diff --

ये दोनों विशेष नाम और व्हाट्सएप प्रमाण हैं। यद्यपि आप .py एक्सटेंशन वाली निर्देशिकाओं के लिए फ़िल्टर करना चाहते हैं :)


1 मुझे git diff -- {.,**}/*.pyआमतौर पर करना पसंद है

2 जब ग्लोबस्टार सक्षम होता है, तो git diff -- **/*.pyपहले से ही शामिल होता है ./*.py। बैश के मैनपेज में: 'यदि a / द्वारा अनुसरण किया जाता है, तो दो समीपवर्ती * s केवल निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएंगे।'


4

सरल फ़ाइल पैटर्न के लिए, यह काम करने लगता है:

$ git ls-files -zm '*.txt' | xargs --null git diff

व्हॉट्सएप सुरक्षित, और आपके पास कई एक्सटेंशन भी हो सकते हैं:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

विस्तार के लिए कमांड लाइन तर्क।

git diff *.py

वैकल्पिक रूप से, आप कर सकते हैं पाइप findमें git diff:

find . -name '*.py' -type f | git diff --

कृपया उत्तर को थोड़ा और अधिक पढ़ें। आप के साथ पर्याप्त हो सकता हैgit diff *.py चिल्लाने वाली शीर्षकों के और बिना
आत्महत्या कर सकते थे

1
'स्काउट हेडिंग' एक शेल स्क्रिप्ट में # -comments थे।
हुग्डब्रोर्न

यह एकमात्र समाधान है जो मेरे लिए काम करता है, उद्धरण (आदि) विंडोज कमांड प्रॉम्प्ट पर काम नहीं करते थे।
एड बेयेट्स

1

जैसा कि git संस्करण 2.18.0 पर परीक्षण किया गया है, फ़ाइल एक्सटेंशन को दोहरे उद्धरण चिह्नों के साथ उद्धृत किया जाना चाहिए। यदि आप अपने स्थानीय भंडार और दूरस्थ एक के बीच के अंतिम अंतरों को खोजना चाहते हैं, तो खींचने के बाद, आप उपयोग कर सकते हैं:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

उदाहरण के लिए:

git diff master@{1} origin/master --name-only "*.cs"

1
मेरे लिए यह काम किया जब मैंने प्रदान किया - विस्तार से पहले, इस तरहgit diff master@{1} origin/master --name-only -- "*.cs"
३३३

0

ऊपर दिए गए उत्तरों में से कोई भी मेरे लिए काम नहीं करता है git bash विंडोज पर । मुझे यकीन नहीं है कि यह एक संस्करण चीज है (मैं 1.8.4 का उपयोग कर रहा हूं) या विंडोज / बैश चीज; इसके अलावा, मेरे मामले में, मैं दो शाखाओं को अलग करना चाहता था, जहां प्रत्येक शाखा में दूसरी शाखा में मौजूद अतिरिक्त फाइलें नहीं थीं (इस प्रकार 'खोजें' आधारित हैं)।

वैसे भी यह मेरे लिए काम करता है (मेरे उदाहरण में, अजगर फ़ाइलों के बीच एक अंतर की तलाश में):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

यह stackoverflow.com/a/8554987/4233229 काम करता है, लेकिन किसी को विंडोज के लिए सिंगल के बजाय डबल कोट्स का उपयोग करना है
lcnittl

0

git diff केवल अस्थिर फ़ाइलों में अंतर दिखाएगा।

मुझे यह प्रश्न इसलिए मिला क्योंकि मैं .infoफ़ाइलों को बाहर करना चाहता था git diff। मैंने इसे स्टैज करके हासिल किया git add *.info, जिससे बची हुई फाइलें कम हो गईं।


0

मैं इससे घायल हो गया:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

यह शो केवल निर्दिष्ट कमिट के लिए भिन्न होता है यदि फ़ाइलनाम में 'टेस्ट' (केस असंवेदनशील) शब्द होता है और .sqlआपके केस के लिए आवश्यक रूप से पाइपलाइन को संशोधित नहीं करता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.