git - एक निश्चित स्ट्रिंग के लिए भंडार में सभी गिट और Mercurial प्रतिबद्धताओं के माध्यम से कैसे खोज करें?




(7)

Mercurial के साथ आप एक करते हैं

$ hg grep "search for this" [file...]

ऐसे कई विकल्प हैं जो खोजे गए संशोधन की सीमा को सीमित करते हैं।

मेरे पास कुछ शाखाओं और लटकने वाली चीजों के साथ एक गिट भंडार है। मैं एक विशिष्ट स्ट्रिंग के लिए भंडार में ऐसी सभी कामों को खोजना चाहता हूं।

मुझे पता है कि इतिहास में सभी कामों का लॉग कैसे प्राप्त किया जाए, लेकिन इनमें शाखाओं या खतरनाक ब्लब्स शामिल नहीं हैं, केवल हेड का इतिहास। मैं उन्हें एक विशिष्ट प्रतिबद्धता खोजने के लिए, उन सभी को प्राप्त करना चाहता हूं जो गलत स्थानांतरित हो गए हैं।

मैं यह भी जानना चाहूंगा कि यह Mercurial में कैसे करें, क्योंकि मैं स्विच पर विचार कर रहा हूं।


Mercurial में आप किसी विशेष उपयोगकर्ता को खोजने के लिए प्रतिबद्ध संदेशों और hg log --user में कीवर्ड खोजने के लिए hg log --user का उपयोग करते हैं। hg help log को सीमित करने के अन्य तरीकों के लिए hg help log देखें।


आरक्यू के जवाब पर बिल्डिंग, मैंने पाया कि यह लाइन जो मैं चाहता हूं वह करता है:

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

जो प्रतिबद्ध आईडी, फ़ाइल नाम की रिपोर्ट करेगा, और मिलान लाइन को प्रदर्शित करेगा, इस तरह:

91ba969:testFile:this is a test

... क्या कोई इस बात से सहमत है कि यह मानक git grep कमांड में शामिल करने का एक अच्छा विकल्प होगा?


गिट के बारे में नहीं जानते, लेकिन Mercurial में मैं कुछ एचडी लॉग के आउटपुट को कुछ sed / perl / जो भी स्क्रिप्ट खोजता हूं उसे खोजने के लिए बस पाइप करता हूं। यदि आप चाहें तो खोजना आसान बनाने के लिए आप टेम्पलेट या स्टाइल का उपयोग करके एचजी लॉग के आउटपुट को कस्टमाइज़ कर सकते हैं।

इसमें रेपो में सभी नामांकित शाखाएं शामिल होंगी। Mercurial में कुछ नहीं है जैसे blobs afaik।


तर्क के रूप में संदर्भ लेने वाले किसी भी कमांड को git rev-list लिए मैन पेज में दस्तावेज किए गए सभी विकल्प स्वीकार करेंगे:

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

तो उदाहरण के लिए git log -Sstring --all सभी string उल्लेख करने वाले सभी git log -Sstring --all को प्रदर्शित करेगा और जो किसी शाखा से या टैग से पहुंच योग्य हैं (मुझे लगता है कि आपके लटकने वाले कामों को कम से कम टैग के साथ नामित किया गया है)।


यदि आप एक vim उपयोगकर्ता हैं, तो आप टिग (apt-get स्थापित टिग) स्थापित कर सकते हैं, और vim पर खोजने के लिए / उसी आदेश का उपयोग कर सकते हैं

https://blogs.atlassian.com/2013/05/git-tig/


आप git log -g साथ लटकते हुए काम देख सकते हैं।

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

तो आप इसे एक प्रतिबद्ध संदेश में एक विशेष स्ट्रिंग खोजने के लिए कर सकते हैं जो खतरे में है:

git log -g --grep=search_for_this

वैकल्पिक रूप से, यदि आप किसी विशेष स्ट्रिंग के लिए परिवर्तनों को खोजना चाहते हैं, तो आप पिकैक्स खोज विकल्प का उपयोग कर सकते हैं, "-एस":

git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)

गिट 1.7.4 -G विकल्प जोड़ देगा, जिससे आप <regexp> को स्थानांतरित कर सकते हैं, जब <regexp> को स्थानांतरित किया गया था, जो-एस नहीं कर सकता है। -एस केवल तभी आपको बताएगा जब स्ट्रिंग वाले लाइनों की कुल संख्या बदल गई है (यानी स्ट्रिंग को जोड़ना / निकालना)।

अंत में, आप खतरनाक कामों को देखने के लिए गिटक का उपयोग कर सकते हैं:

gitk --all $(git log -g --pretty=format:%h)

और फिर गलत स्थान की फ़ाइल देखने के लिए अपनी खोज सुविधाओं का उपयोग करें। लापता प्रतिबद्धता को मानते हुए ये सभी काम "समाप्त हो चुके" नहीं हैं और कचरा इकट्ठा किया गया है, जो हो सकता है कि यह 30 दिनों तक लटक रहा हो और आप रीफ्लॉग समाप्त कर दें या उन्हें समाप्त करने वाले आदेश को चलाएं।





mercurial