2012-03-11 12 views
32

मान लें कि मैं एक गिट भंडार में निहित स्रोत कोड में एक विधि का नाम बदलना चाहता हूं। मैं इसे हाथ से कर सकता था, लेकिन विधि का नाम कई स्थानों पर हो सकता है (उदाहरण के लिए, यूनिट टेस्ट, दस्तावेज़ीकरण, वास्तविक विधि)। यह जांचने के लिए कि विधि कहां उपयोग की जाती है, मैं 'git grep' का उपयोग करता हूं। मुझे केवल 'लाइनों को दिखाने के लिए' git grep 'मिलता है जिसे मैं बदलना चाहता हूं, और फिर मेरे पास उन पंक्तियों को स्वचालित रूप से बदलने के लिए वर्कफ़्लो नहीं है।क्या कोई 'गिट sed' या समकक्ष है?

मैं इस अंतिम चरण को करने के लिए स्वचालित तरीके से (गिट टूल्स का उपयोग कर रहा हूं) ढूंढ रहा हूं। मैं उम्मीद कर रहा था कि कुछ प्रकार का 'गिट sed' या समकक्ष था, लेकिन मुझे कोई नहीं मिला।

इंटरफ़ेस मैं अच्छा होगा सोच रहा हूँ: Git एसईडी के/पुराने विधि-नाम/नई विधि-नाम/जी '

उत्तर

11

आप अपने config में git sed के रूप में है कि एक फ़ाइल में कहीं और फिर इसे उर्फ ​​एक

for i in $(git grep --full-name -l old_method_name) 
do 
perl -p -i -e 's/old_method_name/new_method_name/g' $i 
done 

छड़ी कर सकता है।

अद्यतन: नीचे tchrist द्वारा टिप्पणी एक बेहतर समाधान है क्योंकि यह बार-बार स्पेलिंग से पर्ल को रोकता है।

+5

मुझे संदेह है कि आपको आदेश के अंत में '$ i' की आवश्यकता है। इसके अलावा, आपको बार-बार पर्ल लॉन्च करने की आवश्यकता नहीं है। यह उन सभी फ़ाइलों को संसाधित करेगा जो आप इसे तर्क के रूप में देते हैं। तो 'perl -i.orig -pe 's/\ bold_method_name \ b/new_method_name/g' $ (git grep --full-name -l old_method_name) 'पर्याप्त होना चाहिए। – tchrist

+0

बहुत बेहतर। मैंने स्निपेट में $ i तय कर दिया है। –

+0

ने इसे गिट-एक्स्ट्रा में स्थानांतरित किया: https://github.com/tj/git-extras/pull/466 – anarcat

42

आप git ls-files संयोजन में xargs और sed साथ इस्तेमाल कर सकते हैं:

git ls-files -z | xargs -0 sed -i -e 's/old-method-name/new-method-name/g' 
+0

बहुत बढ़िया! क्या मुझे फाइलनामों में व्हाइटस्पेस के बारे में चिंता करने की ज़रूरत है? –

+3

हां। यदि आपके पास फ़ाइल नामों में व्हाइटस्पेस है, तो 'git ls-files -z | का उपयोग करें xargs -0 sed ... '। –

+1

शायद मुझे लगता है कि आप इसे काम करने के लिए 'ls-files' और '-0' तक xargs पास कर सकते हैं। –

15

अपनी पोस्ट के लिए नौफल और ग्रेग दोनों के लिए धन्यवाद। मैंने अपने समाधानों को संयुक्त किया, और एक ऐसा पाया जो गिट grep का उपयोग करता है (मेरे रिपो के लिए गिट एलएस-फाइलों की तुलना में अधिक मजबूत, क्योंकि ऐसा लगता है कि उनमें केवल उन फाइलों की सूची है जो वास्तविक स्रोत कोड हैं - उदाहरण के लिए फ़ोल्डर्स को सबमिशन नहीं करते हैं), और यह भी है पुराना तरीका नाम और केवल एक ही स्थान पर नई विधि का नाम:

मेरी ~/.gitconfig फ़ाइल के [alias] ब्लॉक में:

sed = ! git grep -z --full-name -l '.' | xargs -0 sed -i -e 

का उपयोग करें:

git sed 's/old-method-name/new-method-name/ig' 
+1

यह लिनक्स में काम करता है, लेकिन ओएस एक्स पर यह सभी फाइलों को रिपोजिटरी में कॉपी करता है और '-e' जोड़ता है उनका अंत ऐसा लगता है कि यह बेहतर काम करता है: 'git grep -z --full-name -l'। ' | xargs -0 sed -i '' '। –

9

यहाँ एक समाधान है कि उन लोगों के जोड़ती है नौफल और क्लेटोंट्सस्ले और उन फ़ाइलों को छूने से बचाता है जो बदले नहीं जाएंगे।

मेरी ~/.gitconfig फ़ाइल के [alias] ब्लॉक में:

psed = !sh -c 'git grep --null --full-name --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' - 

का उपयोग करें:

git psed old_method_name new_method_name 
+0

क्या मैं इसे सामान्य प्रतिस्थापन के लिए भी उपयोग कर सकता हूं, उदा। प्रतिस्थापन जिसमें रिक्त स्थान शामिल हैं? –

+0

हां, लेकिन आपके खोल के आधार पर आपको यह समायोजित करना पड़ सकता है कि आप तर्कों को कितनी बार उद्धृत करते हैं। –

1

ध्यान दें कि git 2.1 (Q3 2014) शुरू करने, आप "full-name" git grep के लिए सेट कर सकते हैं डिफ़ॉल्ट रूप से।
(Andreas Schwab द्वारा commit 6453f7b देखें)

"git grep" "--full-name" डिफ़ॉल्ट होने के लिए मजबूर करने के लिए सीखा grep.fullname विन्यास चर।
यह लिखित उपयोगकर्ताओं पर प्रतिगमन का कारण बन सकता है जो इस नए व्यवहार की अपेक्षा नहीं करते हैं।

इसका मतलब है कि पिछले समाधान से लाभ कर सकते हैं:

git config grep.full-name true 

और उपयोग:

psed = !sh -c 'git grep --null --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' - 
0

git-search-replace GitHub पर देखें - यह इस बात के लिए वास्तव में बनाया गया है।

1

हां, वहां है। उबंटू में पैकेज git-extras कमांड प्रदान करता है। इसे स्थापित करें:

$ sudo apt-get install git-extras 

इसका उपयोग करें जैसे उदा। एक वर्तनी समस्या को दूर करने के लिए जल्दी:

$ git sed 'qoute' 'quote' 

दुर्भाग्य से यह क्या Git ग्रेप की तरह फ़ाइल फिल्टर का समर्थन नहीं करता:

$ git grep -e 'class' -- '*.py' 

ही कार्यक्षमता भी मैक और अन्य ऑपरेटिंग सिस्टम पर मौजूद है। अपने installation page चेकआउट करें।

संबंधित मुद्दे