दिलचस्प पोस्ट
म्युचुअल सूचना और दो छवियों की संयुक्त एंट्रोपी – MATLAB 'नाम' या 'आईडी' के साथ एचटीएमएल एंकर? IFrame के DOM को jQuery का उपयोग कैसे करें? एंड्रॉइड में EditText का फोकस रंग कैसे बदल सकता है जावास्क्रिप्ट मल्टीप्लेयर गेम में धोखाधड़ी को रोकने के लिए क्या अच्छे तरीके हैं? एक फ्लोटिंग प्वाइंट नंबर के चिन्ह, मैन्टिसा और एक्सपोनेंट कैसे प्राप्त करें सी ++ 11: मैं कई एल्ग्स से ट्यूपल तक जा सकता हूं, लेकिन क्या मैं ट्यूपल से कई एल्ग्स तक जा सकता हूं? मुद्रित पृष्ठों पर Google Chrome दोहराने वाले टेबल हेडर होने पर कैसे + = (प्लस समान) काम करता है? AJAX पोस्ट त्रुटि: असुरक्षित हेडर "कनेक्शन" सेट करने के लिए मना कर दिया जावा में भौगोलिक स्थान प्राप्त करने का सर्वोत्तम तरीका NSMutablearray को NSUserDefaults में कैसे सहेजना है एक HTML तत्व की स्थिति (एक्स, वाई) पुनर्प्राप्त करें कोड का उपयोग करने के लिए ImageView का मार्जिन कैसे सेट करें, xml नहीं Fill_parent और wrap_content के बीच अंतर क्या है?

फ़ाइल में एक विशिष्ट पंक्ति के लिए लॉग को पुनः प्राप्त करें?

क्या गिट को आपको एक कमिट लॉग देने के लिए कोई तरीका है जो किसी फ़ाइल में एक विशेष पंक्ति को छुआ?

git blame तरह git blame , लेकिन git blame आपको अंतिम प्रतिबद्धता दिखा देगा जो एक विशेष पंक्ति को छुआ था।

मैं वास्तव में एक समान लॉग प्राप्त करना चाहूंगा, न कि फाइल में कहीं से भी कमिट करता है, लेकिन केवल एक विशेष लाइन को छूने वाले कमान

वेब के समाधान से एकत्रित समाधान "फ़ाइल में एक विशिष्ट पंक्ति के लिए लॉग को पुनः प्राप्त करें?"

गिट भी देखें : पता चलता है कि कभी भी कई पंक्तियों को छुआ है ।


गिट 1.8.4 के बाद से , git log में -L लाइन के विकास को देखने के लिए है।

उदाहरण के लिए, मान लीजिए आप git blame का आउटपुट देखते हैं। -L150,+11 अर्थ है "केवल 150 से 150 + 11 की रेखाएं देखें":

 $ git blame -L150,+11 -- git-web--browse.sh a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 150) die "The browser $browser is not a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 151) fi 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 152) fi 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 153) 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 154) case "$browser" in 81f42f11 git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:38 +0100 155) firefox|iceweasel|seamonkey|iceape) 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 156) # Check version because firefox < 2.0 do 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 157) vers=$(expr "$($browser_path -version)" 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 158) NEWTAB='-new-tab' 5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 159) test "$vers" -lt 2 && NEWTAB='' a0685a4f git-web--browse.sh (Dmitry Potapov 2008-02-09 23:22:22 -0800 160) "$browser_path" $NEWTAB "$@" & 

और आप अब 155 लाइन के इतिहास को जानना चाहते हैं।

फिर, git log उपयोग करें यहां, -L 155,155:git-web--browse.sh अर्थ है " git-web--browse.sh नामक फ़ाइल में 155 से 155 पंक्तियों का विकास"।

 $ git log --pretty=short -u -L 155,155:git-web--browse.sh commit 81f42f11496b9117273939c98d270af273c8a463 Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> web--browse: support opera, seamonkey and elinks diff --git a/git-web--browse.sh b/git-web--browse.sh --- a/git-web--browse.sh +++ b/git-web--browse.sh @@ -143,1 +143,1 @@ -firefox|iceweasel) +firefox|iceweasel|seamonkey|iceape) commit a180055a47c6793eaaba6289f623cff32644215b Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> web--browse: coding style diff --git a/git-web--browse.sh b/git-web--browse.sh --- a/git-web--browse.sh +++ b/git-web--browse.sh @@ -142,1 +142,1 @@ - firefox|iceweasel) +firefox|iceweasel) commit 5884f1fe96b33d9666a78e660042b1e3e5f9f4d9 Author: Christian Couder <chriscool@tuxfamily.org> Rename 'git-help--browse.sh' to 'git-web--browse.sh'. diff --git a/git-web--browse.sh b/git-web--browse.sh --- /dev/null +++ b/git-web--browse.sh @@ -0,0 +127,1 @@ + firefox|iceweasel) 

पिक-कुल्हाड़ी का प्रयोग करके आप कमिट का एक सेट प्राप्त कर सकते हैं।

 git log -S'the line from your file' -- path/to/your/file.txt 

इससे आपको उन सभी कमेटी मिलेंगी जो उस फ़ाइल में उस पाठ को प्रभावित करें। अगर फाइल को किसी बिंदु पर बदल दिया गया था, तो आप –follow-parent जोड़ सकते हैं

यदि आप इन सभी संपादनों में किए गए कमानों का निरीक्षण करना चाहते हैं, तो आप पाईप का परिणाम जीआईटी शो में कर सकते हैं:

 git log ... | xargs -n 1 git show 

Git 1.8.4 में कार्यान्वित नीचे दिए गए आदेश का उपयोग करने का प्रयास करें।

 git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename> 

इसलिए, आपके मामले में upperLimit और lowerLimit है स्पर्श lowerLimit

मुझे विश्वास नहीं है कि इसके लिए अंतर्निहित कुछ भी है। इस तथ्य से यह मुश्किल हो गया है कि एक पंक्ति के लिए दुर्लभ यह कई फाइलों को बदलने के बिना कई बार बदलता है, इसलिए आप लाइन संख्याओं को बहुत बदलते रहेंगे।

यदि आप बहुत भाग्यशाली हैं कि लाइन में हमेशा कुछ पहचाने जाने वाली विशिष्ट विशेषता होती है, उदाहरण के लिए किसी चर का असाइनमेंट जिसका नाम कभी नहीं बदलता है, तो आप git blame -L लिए regex पसंद का उपयोग कर सकते हैं। उदाहरण के लिए:

 git blame -L '/variable_name *= */',+1 

लेकिन यह केवल उस रेगेक्स के लिए पहला मैच पाता है, इसलिए यदि आपके पास लाइन मिलान करने का कोई अच्छा तरीका नहीं है, तो यह बहुत मददगार नहीं है।

आप कुछ हुक कर सकते हैं, मुझे लगता है। मेरे पास अभी अभी कोड लिखने का समय नहीं है, लेकिन … इन रेखाओं के साथ कुछ रन git blame -n -L $n,$n $file पहले फ़ील्ड पिछला प्रतिबद्ध था, और दूसरे क्षेत्र उस कतार में पंक्ति संख्या है, क्योंकि यह बदल सकता था। उनको पकड़ो, और git blame -n $n,$n $commit^ $file , यानी आखिरी बार फ़ाइल बदल जाने से पहले प्रतिबद्ध चीज़ों से शुरू करें

(नोट करें कि यह आपको असफल करेगा यदि अंतिम बदलाव जो कि लाइन को बदलते हैं, वह एक मर्ज कमिट होता है। यह प्राथमिक तरीका यह हो सकता है कि पंक्ति को विलय विरोध समाधान के भाग के रूप में बदल दिया गया था।)

संपादित करें: मैं मार्च 2011 से इस मेलिंग सूची में हुआ था, जो आज का उल्लेख है कि tig और git gui में एक ऐसी सुविधा है जो आपको ऐसा करने में मदद करेगी। ऐसा लगता है कि इस सुविधा पर विचार किया गया है, लेकिन समाप्त नहीं हुआ, केवल खुद के लिए

यह करने के लिए एक अत्यंत आसान तरीका है vim-fugitive का उपयोग कर। बस फ़ाइल को वीआईएम में खोलें, उस पंक्ति (लाइनों) का चयन करें जो आपको V का उपयोग करने में रुचि रखते हैं, फिर प्रवेश करें

 :Glog 

अब आप उपयोग कर सकते हैं :cnext और :cprev फाइल के सभी संशोधन देखने के लिए जहां उस पंक्ति को संशोधित किया गया है। किसी भी बिंदु पर, दर्ज करें :Gblame शा, लेखक, और तारीख जानकारी देखने के लिए :Gblame

यह फाइल $FILE की पंक्ति $LINE दिखाने के लिए प्रत्येक अर्थपूर्ण संशोधन के लिए git blame को कॉल करेगा:

 git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE 

हमेशा की तरह, दोष प्रत्येक पंक्ति की शुरुआत में संशोधन संख्या दिखाता है आप जोड़ सकते हैं

 | sort | uniq -c 

एकत्रित परिणाम प्राप्त करने के लिए, कुछ ऐसी चीज की तरह जो इस लाइन को बदल देती है (नहीं, यदि कोड केवल चारों ओर ले जाया गया है, तो यह लाइन के विभिन्न सामग्रियों के लिए एक ही प्रतिबद्ध आईडी को दो बार दिखा सकता है। अधिक विस्तृत विश्लेषण के लिए आपको आसन्न कमिट के लिए git blame परिणाम की तुलनात्मक तुलना करना होगा। किसी को?)

यहां एक समाधान है जो एक git alias को परिभाषित करता है, ताकि आप इसे इस तरह से उपयोग कर सकें:

 git rblame -M -n -L '/REGEX/,+1' FILE 

आउटपुट उदाहरण:

 00000000 18 (Not Committed Yet 2013-08-19 13:04:52 +0000 728) fooREGEXbar 15227b97 18 (User1 2013-07-11 18:51:26 +0000 728) fooREGEX 1748695d 23 (User2 2013-03-19 21:09:09 +0000 741) REGEXbar 

आप अपने .gitconfig में उपनाम परिभाषित कर सकते हैं या बस निम्न कमांड चला सकते हैं

 git config alias.rblame !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); echo $line; done' dumb_param 

यह एक बदसूरत एक-लाइनर है, इसलिए ये एक डी-ऑब्फ़सकेटेड समकक्ष बैश फ़ंक्शन है:

 git-rblame () { local commit line while line=$(git blame "$@" $commit 2>/dev/null); do commit="${line:0:8}^" if [ "00000000^" == "$commit" ]; then commit=$(git rev-parse HEAD) fi echo $line done } 

पिकएक्सा समाधान ( जीआईटी लॉग – पिक्केक्स-रिजेक्स -'एसआरजेईएक्स ' ) केवल आपको रेखा के अतिरिक्त / विलोपन देगा, न कि रेग्युलर एक्सप्रेशन वाले लाइन के अन्य बदलाव

इस समाधान की एक सीमा यह है कि जीआईटी का दोष केवल 1 रेगएक्स मैच देता है, इसलिए यदि एकाधिक मैचों में मौजूद हैं तो पुनरावर्तन दूसरे लाइन का अनुसरण करने के लिए "कूद" हो सकता है उन "छलांग" को स्थानांतरित करने के लिए पूर्ण इतिहास आउटपुट को जांचना सुनिश्चित करें और फिर परजीवी लाइनों को अनदेखा करने के लिए अपने रीगैक्स को ठीक करें

अंत में, यहां एक वैकल्पिक संस्करण है जो प्रत्येक डीटीएफ को प्राप्त करने के लिए प्रतिबद्ध पर जीआईटी शो चलाता है:

 git config alias.rblameshow !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); git show $commit; done' dumb_param 

मेरे मामले में लाइन संख्या में बहुत समय बदल गया था। मैं जीआईटी 1.8.3 पर भी था, जो "जीआईटी दोष-एल" में रैगेक्स का समर्थन नहीं करता है। (RHEL7 अभी भी 1.8.3 है)

 myfile=haproxy.cfg git rev-list HEAD -- $myfile | while read i do git diff -U0 ${i}^ $i $myfile | sed "s/^/$i /" done | grep "<sometext>" 

एक लाइन:

 myfile=<myfile> ; git rev-list HEAD -- $myfile | while read i; do git diff -U0 ${i}^ $i $myfile | sed "s/^/$i /"; done | grep "<sometext>" 

यह निश्चित रूप से एक स्क्रिप्ट या फ़ंक्शन में बनाया जा सकता है।

आप git दोष कमांड में प्रत्येक कमिट के सारांश को पुनः प्राप्त करने के लिए git blame और git log कमांड को मिश्रण कर सकते हैं और उन्हें जोड़ सकते हैं। कुछ निम्नलिखित bash + awk स्क्रिप्ट की तरह। यह कोड टिप्पणी इनलाइन के रूप में प्रतिबद्ध सारांश जोड़ता है।

 git blame FILE_NAME | awk -F" " \ '{ commit = substr($0, 0, 8); if (!a[commit]) { query = "git log --oneline -n 1 " commit " --"; (query | getline a[commit]); } print $0 " // " substr(a[commit], 9); }' 

एक पंक्ति में:

 git blame FILE_NAME | awk -F" " '{ commit = substr($0, 0, 8); if (!a[commit]) { query = "git log --oneline -n 1 " commit " --"; (query | getline a[commit]); } print $0 " // " substr(a[commit], 9); }' 

मैट के जवाब को सरल करना –

git blame -L14,15 -- <file_path>

यहां आपको 14 to 15 लाइनों के लिए एक दोष मिलेगा।

चूंकि -L विकल्प को एक पैरा के रूप में Range उम्मीद है, हम -L विकल्प का उपयोग करके एक पंक्ति के लिए Blame नहीं मिल सकते

संदर्भ