उन फ़ाइलों को खोजें, जो कि .ignignore में नहीं हैं


12

मुझे अपनी परियोजना में फाइल प्रदर्शित करने वाली कमांड मिली है:

find . -type f -not -path './node_modules*' -a -not -path '*.git*' \
       -a -not -path './coverage*' -a -not -path './bower_components*' \
       -a -not -name '*~'

मैं फ़ाइलों को कैसे फ़िल्टर कर सकता हूं ताकि यह उन लोगों को न दिखाए जो कि .ignignore में हैं?

मैंने सोचा था कि मैं उपयोग करता हूं:

while read file; do
    grep $file .gitignore > /dev/null && echo $file;
done

लेकिन .itignore फ़ाइल में ग्लोब पैटर्न हो सकते हैं (यदि फ़ाइल .गितिग्नोर में है तो पथ के साथ काम नहीं करेगा), मैं उन पैटर्नों पर आधारित फ़ाइलों को कैसे फ़िल्टर कर सकता हूं जिनमें ग्लब्स हो सकते हैं?

जवाबों:


11

gitgit-check-ignoreयह जाँचने के लिए प्रदान करता है कि किसी फ़ाइल को बाहर रखा गया है या नहीं .gitignore

तो आप उपयोग कर सकते हैं:

find . -type f -not -path './node_modules*' \
       -a -not -path '*.git*'               \
       -a -not -path './coverage*'          \
       -a -not -path './bower_components*'  \
       -a -not -name '*~'                   \
       -exec sh -c '
         for f do
           git check-ignore -q "$f" ||
           printf '%s\n' "$f"
         done
       ' find-sh {} +

ध्यान दें कि आप इसके लिए बड़ी लागत का भुगतान करेंगे क्योंकि प्रत्येक फ़ाइल के लिए चेक का प्रदर्शन किया गया था।


आखिर है क्या find-sh {} +?
ज्यूकिक


ठीक है, और क्या है find-sh?
ज्यूकिक

@ जुबिक यह नाम है जिसे आपने इनलाइन-श स्क्रिप्ट के लिए दिया है, इसलिए यदि त्रुटि होती है, तो आपके पास एक सार्थक त्रुटि संदेश होगा
cuonglm

@jcubic find /tmp -exec sh -c ': "${non_existed_var:?foo}"' find-sh {} +उदाहरण के लिए प्रयास करें
cuonglm

9

ऐसा करने के लिए एक git कमांड है: उदा

my_git_repo % git grep --line-number TODO                                                                                         
desktop/includes/controllers/user_applications.sh:126:  # TODO try running this without sudo
desktop/includes/controllers/web_tools.sh:52:   TODO: detail the actual steps here:
desktop/includes/controllers/web_tools.sh:57:   TODO: check if, at this point, the menurc file exists. i.e. it  was created

जैसा कि आपने बताया, यह एक सामान्य grep होगा जो सामान्य grep विकल्पों में से अधिकांश होगा, लेकिन यह .gitआपकी .gitignoreफ़ाइल में किसी भी फ़ाइल या फ़ोल्डर को नहीं खोजेगा।
अधिक जानकारी के लिए, देखेंman git-grep

submodules:

यदि आपके पास इस git रेपो के अंदर अन्य git रेपो हैं, (वे सबमॉडुल्स में होने चाहिए) तो आप --recurse-submodulesसबमॉड्यूल में खोज करने के लिए ध्वज का उपयोग कर सकते हैं


महान, यह लगभग काम करता है क्योंकि मेरे पास वर्तमान निर्देशिका के अंदर अन्य गिट प्रतिनिधि हैं, यही कारण है कि मेरे पास "* .गित" है।
जेकुबिक

8

उन फ़ाइलों को दिखाने के लिए जो आपके चेकआउट में हैं और जिन्हें Git द्वारा ट्रैक किया गया है, उपयोग करें

$ git ls-files

इस कमांड में दिखाने के लिए कई विकल्प हैं, जैसे कैश्ड फाइलें, अनट्रैक फाइलें, संशोधित फाइलें, नजरअंदाज की गई फाइलें आदि git ls-files --help


मैं इसके बारे में भी सोचता हूं, git ls-filesलेकिन यह नहीं सोचता कि इसमें अनके फाइलों को दिखाने का विकल्प है, कौन सा?
congonglm

1
@cuonglm -o(अन्य)। उदाहरण के लिए,git ls-files -o -X .gitignore
Kusalananda

आह हां, लेकिन उस मामले को संभाल नहीं सकते जहां फ़ाइल को पहले ट्रैक किया गया था लेकिन इसमें शामिल है .gitignore
congonglm

माइनर नोट: यह सिस्टम से वास्तविक फ़ाइलों को सूचीबद्ध नहीं करता है, लेकिन गिट इतिहास में शामिल फाइलें। यह केस-असंवेदनशील प्रणालियों (जैसे विंडोज शेयर) पर एक सूक्ष्म अंतर हो सकता है। कहो, मैंने प्रतिबद्ध किया ।/foo.txt लेकिन फिर इसका नाम बदलकर ./Foo.txt रख दिया। कुछ Git ग्राहकों इस परिवर्तन और को नहीं पहचानेंगे git ls-filesआउटपुट ./foo.txt जबकि findचाहेंगे उत्पादन ./Foo.txt
Griddo

2

आप एक सरणी का उपयोग कर सकते हैं जिसमें बैश ग्लोब प्रदर्शन किया जाएगा।

इस तरह की फाइलें होना:

touch file1 file2 file3 some more file here

और ignoreइस तरह एक फ़ाइल होने

cat <<EOF >ignore
file*
here
EOF

का उपयोग करते हुए

arr=($(cat ignore));declare -p arr

इसका परिणाम होगा:

declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'

फिर आप उन डेटा में हेरफेर करने के लिए किसी भी तकनीक का उपयोग कर सकते हैं।

मैं व्यक्तिगत रूप से कुछ इस तरह से पसंद करता हूं:

awk 'NR==FNR{a[$1];next}(!($1 in a))'  <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore

gitignorebashग्लोब का सुपरसेट है , आप कुछ इस तरह से याद करेंगे जैसे!file*
cuonglm

@cuonglm तुम क्या मतलब है !file*? फ़ाइल में उपेक्षा या फ़ाइल नाम के रूप में एक ग्लोब पैटर्न?
जॉर्ज वासिलिउ

gitignoreफ़ाइल पैटर्न को स्वीकार करें जैसे !file*कि फ़ाइलों को बाहर करना शुरू करें file, और साथ ही डबल स्टार**
cuonglm

.gitignoreसुविधाओं का एक समूह है, जिनमें से सभी को सीधे बैश में लागू करना आसान नहीं हो सकता है: git-scm.com/docs/ignignore । हालांकि केवल साधारण
ग्लब्स से मिलकर इग्नोर

@cuonglm का अर्थ है आप अनुवाद के !रूप में नहीं? शायद विस्तारित ग्लोबिंग इस स्थिति को संभाल सकता है। डबलस्टार के बारे में, बैश इसे संभाल सकता है shopt -s globstar
जॉर्ज वासिलिउ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.