গিট গ্রেপ অনুসন্ধান থেকে কীভাবে নির্দিষ্ট ডিরেক্টরি / ফাইলগুলি বাদ দেওয়া যায়


144

গিট সংগ্রহস্থলটি ব্যবহার করার সময় কোনও নির্দিষ্ট পাথ / ডিরেক্টরি / ফাইলগুলি বাদ দেওয়ার কোনও উপায় আছে কি git grep? --excludeসাধারণ grepকমান্ডের বিকল্পের মতো কিছু ?

আমার ব্যবহার করা দরকার git grepকারণ grepবড় গিট সংগ্রহস্থলগুলিতে সরাসরি খুব ধীরে চলতে থাকে।


ব্যাশ উপর এরকম একটি সম্ভাব্য কার্যসংক্রান্ত হবে: stackoverflow.com/questions/216995/...
সিরো Santilli郝海东冠状病六四事件法轮功

8
এই বৈশিষ্ট্যটি 1.9.0 এ যুক্ত করা হয়েছে আমার নীচের উত্তরটি দেখুন
কেবলমাত্র

উত্তর:


17

এটি সম্ভব নয়, তবে সম্প্রতি আলোচনা হয়েছে । লিঙ্কে প্রস্তাবিত কাজ:

আপনি *.dllতখন .gitignore ফাইলটি রাখতে পারেন git grep --exclude-standard

সম্পাদনা একমাত্র অধ্যায়ের উত্তর দেখুন , যেহেতু গিট 1.9.0 থেকে এটি সম্ভব।


2
এটি সত্য হিসাবে ব্যবহৃত হত কিন্তু আর নেই, এখন গিটে এটি সম্ভব। তা দেখুন নিচের বাস্তব উত্তর হওয়া উচিত: stackoverflow.com/a/30084612/1391445
user1391445

204

গিট ১.৯.০-এ "যাদু শব্দ" excludeযুক্ত হয়েছে pathspec। সুতরাং আপনি যদি foobarমিলে যাওয়া ম্যাচগুলি বাদে প্রতিটি ফাইলে অনুসন্ধান করতে চান তবে *.javaআপনি করতে পারেন:

git grep foobar -- './*' ':(exclude)*.java'

বা !বাদ দেওয়ার জন্য "সংক্ষিপ্ত ফর্ম" ব্যবহার করুন:

git grep foobar -- './*' ':!*.java'

দ্রষ্টব্য যে v2.12 অবধি গিট সংস্করণগুলিতে, বাদ পড়ার সময় pathspecআপনার অবশ্যই কমপক্ষে একটি "অন্তর্ভুক্ত" থাকতে হবে pathspec। উপরের উদাহরণগুলিতে এটি হ'ল ./*(প্রত্যক্ষভাবে বর্তমান ডিরেক্টরিতে সমস্ত কিছু অন্তর্ভুক্ত করা)। গিট v2.13 এ এই বিধিনিষেধ প্রত্যাহার করা হয়েছে এবং git grep foobar -- ':!*.java'এটি ছাড়াই কাজ করে ./*

আপনি রেপোর শীর্ষ থেকে সমস্ত কিছু অন্তর্ভুক্ত করতে :(top)(সংক্ষিপ্ত ফর্ম :/:) এর মতো কিছু ব্যবহার করতে পারেন । তবে তারপরে আপনি সম্ভবত pathspecশীর্ষটি থেকে শুরু করার জন্য আপনার বাদও সামঞ্জস্য করতে চান : :/!*.java(অন্যথায় এটি কেবল *.javaআপনার বর্তমান ডিরেক্টরিতে ফাইলগুলি বাদ দেবে )।

সব "ম্যাজিক শব্দ" একটি অনুমোদিত একটি ভাল রেফারেন্স এর pathspecgit-scm.com (বা শুধু git help glossary)। কোনও কারণে, কার্নেল.আর.জে থাকা ডক্সগুলি প্রকৃতপক্ষে পুরানো হয়ে থাকে যদিও তারা প্রায়শই গুগল অনুসন্ধানে প্রথমে আসে।


4
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'একাধিক সম্পূর্ণ ডিরেক্টরি বাদ দিতে। আমি মনে করি না যদিও এটি পুনরাবৃত্তি প্রতিরোধ করে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

2
ঘন ব্যবহারের জন্য, আপনি ব্যতিক্রম সঙ্গে একটি Git ওরফে করতে পারেন: git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'। তারপর ঠিক git mygrep foobar। (ওরফে শেল # ট্রিক এবং বর্তমান ডিয়ার ব্যবহার করে ))
মেডমন্ডস

এই সমাধানটি দিয়ে আমি যে সমস্যার সমাধান করতে পারি না তা হ'ল ফাইলগুলির প্রতিবেদিত পথগুলি ডাব্লুসি রুটের সাথে সম্পর্কিত। সুতরাং, আমি যদি ডাব্লুসি'র উপ-দিরে থাকি তবে আমি খুঁজে পাওয়া ফাইল (গুলি) -র মতো ব্যবহার করতে পারি না (উদাহরণস্বরূপ কম) তবে সাধারণ পথগুলিকে জংশন করতে হবে। এর কোনও সমাধান আছে (ডাব্লু / ও নিজেই নিজেকে ছুঁড়ে ফেলেছে)? [উইন it এ গিট বাশ]
এলোন্ডারিন

1
ম্যাচযুক্ত ফাইলগুলি কীভাবে প্রতিবেদন করা হয় তার সাথে এই সমাধানটির কোনও যোগসূত্র নেই। কিন্তু আমি শুধু চেষ্টা একটি git grepএবং git ls-filesসাবডিরেক্টরি এবং উভয় প্রতিবেদন ফাইলের নামের বর্তমান ডিরেক্টরির আপেক্ষিক থেকে (এমনকি যখন আপনি ব্যবহার ':(top)'pathspec অন্তর্ভুক্ত করুন)। দুটি কমান্ডের --full-nameমূলের সাথে সম্পর্কিত নামগুলি প্রতিবেদন করার বিকল্প রয়েছে তবে এটি ডিফল্টভাবে বন্ধ off
একমাত্র

1
আমি গিট এলিয়াস ব্যবহার করি না তাই আমি ব্যাশ ফাংশন করেছি, তবে সম্ভবত একটি গিট ওরফে আরও ভাল gist.github.com/cmdcolin/04e2378b60f4457a41904c659368066f
কলিন ডি

62

আপডেট: গিট> = 1.9 এর জন্য প্যাটার্নগুলি বাদ দেওয়ার জন্য স্থানীয় সমর্থন রয়েছে, একমাত্র এর উত্তর দেখুন

এটি পিছনের দিকে মনে হতে পারে তবে আপনি পছন্দ করতে আপনার বর্জনীয় ধরণটির সাথে মেলে না এমন ফাইলগুলির একটি তালিকা পাস করতে পারেন git grep:

git grep <pattern> -- `git ls-files | grep -v <exclude-pattern>`

grep -vপ্রতিটি পাথ মিলছে না ফেরত দেয় <exclude-pattern>। নোট করুন যে git ls-filesএকটি --excludeপ্যারামিটারও নেয় , তবে এটি কেবল চিহ্নবিহীন ফাইলগুলিতে প্রয়োগ করা হয় ।


এর জন্য ধন্যবাদ! গিট গ্রেপ অ্যাক অ্যান্ড কো এর চেয়ে অনেক গতিযুক্ত তবে নির্বিচারে পথগুলি বাদ দিতে সক্ষম না হওয়ায় কথা বলতে কিছুটা
অসুবিধে হয়েছিল

2
দুর্ভাগ্যক্রমে আমার রেপোতে প্রচুর ফাইল রয়েছে। যখন আমি @ কিনানের দৃষ্টিভঙ্গিটি চেষ্টা করি তখন আমি পেয়েছি: "-বাশ: / ইউএসআর / বিন / গিট: যুক্তি তালিকা খুব দীর্ঘ"
বেনিসিমো

2
এটি বেনিসিমোর "আর্গুমেন্ট তালিকা খুব দীর্ঘ" সমস্যা এবং ফাইল নাম ক্যার্যাকটারগুলির সাথে ব্যাশ (যেমন []] দ্বারা ব্যাখ্যা করা বা সংগ্রহস্থলের মধ্যে ফাঁকা স্থান ফাইল ফাইলগুলির সমাধান করতে হবে: গিট এলএস-ফাইল | গ্রেপ-ভি <এক্সক্লু- প্যাটার্ন> | xargs -d '\ n' গিট গ্রেপ <প্যাটার্ন>
স্কাউট

2
কেবলমাত্রর উত্তরটি পরীক্ষা করুন, সম্ভবত এটি এখন পুরোপুরি (আধুনিক সংস্করণ) গিটের মধ্যেই করা সম্ভব।
ডেভিড

ডাউনভোটস কেন? এই উত্তরটি এখনও 1.9 এর আগে গিট সংস্করণগুলিতে প্রযোজ্য। আমি একমাত্র এর উত্তর উল্লেখ করে একটি নোট যুক্ত করেছি।
কিনান

5

আপনার সংগ্রহস্থলগুলিতে একটি অ্যাট্রিবিউট ফাইল তৈরি করে আপনি ফাইল বা ডিরেক্টরিগুলি বাইনারি হিসাবে চিহ্নিত করতে পারেন, যেমন

$ cat .git/info/attributes 
directory/to/ignore/*.* binary
directory/to/ignore/*/*.* binary
another_directory/to/also/ignore/*.* binary

বাইনারি ফাইলগুলিতে ম্যাচগুলি লাইন সহ যেমন তালিকাভুক্ত হয়, যেমন

$ git grep "bar"
Binary file directory/to/ignore/filename matches
other_directory/other_filename:      foo << bar - bazz[:whatnot]

2

@ কেনান দ্বারা বেস হিসাবে উদাহরণ সহ আমি এই স্ক্রিপ্টটি তৈরি করেছি এবং এটি আমার পথে রেখেছি ( ~/bin/) gg। এটি ব্যবহার করে git grepতবে কিছু নির্দিষ্ট ফাইল টাইপ এড়ায়।

আমাদের রেপোতে এটির প্রচুর চিত্র রয়েছে তাই আমি চিত্রনাট্যগুলি বাদ দিয়েছি এবং আমি পুরো রেপো অনুসন্ধান করলে এটি সার্চটাইমকে 1/3 এ নামবে। তবে স্ক্রিপ্টটি সহজেই অন্য ফাইলস্টাইপগুলি বা জেরালপ্যাটার্নগুলি বাদ দিতে পরিবর্তিত হতে পারে।

#!/bin/bash                                                                    
#                                                                              
# Wrapper of git-grep that excludes certain filetypes.                         
# NOTE: The filetypes to exclude is hardcoded for my specific needs.           
#                                                                              
# The basic setup of this script is from here:                                 
#   https://stackoverflow.com/a/14226610/42580                                  
# But there is issues with giving extra path information to the script         
# therefor I crafted the while-thing that moves path-parts to the other side   
# of the '--'.                                                                 

# Declare the filetypes to ignore here                                         
EXCLUDES="png xcf jpg jpeg pdf ps"                                             

# Rebuild the list of fileendings to a good regexp                             
EXCLUDES=`echo $EXCLUDES | sed -e 's/ /\\\|/g' -e 's/.*/\\\.\\\(\0\\\)/'`      

# Store the stuff that is moved from the arguments.                            
moved=                                                                         

# If git-grep returns this "fatal..." then move the last element of the        
# arg-list to the list of files to search.                                     
err="fatal: bad flag '--' used after filename"                                 
while [ "$err" = "fatal: bad flag '--' used after filename" ]; do              
    {                                                                          
        err=$(git grep "$@" -- `git ls-files $moved | grep -iv "$EXCLUDES"` \  
            2>&1 1>&3-)                                                        
    } 3>&1                                                                     

    # The rest of the code in this loop is here to move the last argument in   
    # the arglist to a separate list $moved. I had issues with whitespace in   
    # the search-string, so this is loosely based on:                          
    #   http://www.linuxjournal.com/content/bash-preserving-whitespace-using-set-and-eval
    x=1                                                                        
    items=                                                                     
    for i in "$@"; do                                                          
        if [ $x -lt $# ]; then                                                 
            items="$items \"$i\""                                              
        else                                                                   
            moved="$i $moved"                                                  
        fi                                                                     
        x=$(($x+1))                                                            
    done                                                                       
    eval set -- $items                                                         
done                                                                           
# Show the error if there was any                                              
echo $err                                                                      

নোট 1

মতে এই জিনিস নাম সম্ভব হওয়া উচিত git-ggমত একটি নিয়মিত Git কমান্ড যেমন কল করতে:

$ git gg searchstring

তবে আমি এই কাজ পেতে পারি না। আমি আমার স্ক্রিপ্টটি ~/bin/তৈরি করেছি এবং একটি git-ggসিমিলিংক তৈরি করেছি /usr/lib/git-core/

নোট 2

কমান্ডটি কোনও নিয়মিত shগিট-উর্ফ হিসাবে তৈরি করা যায় না কারণ এটি পরে রেপোর গোড়ায় ডাকা হবে। আর এটাই তো আমি চাই না!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.