2010-12-17 21 views
496

मेरे पास एक कोड बेस है जिसे मैं गिटहब को ओपन सोर्स के रूप में धक्का देना चाहता हूं। इस गिट-नियंत्रित स्रोत पेड़ में, मेरे पास कुछ कॉन्फ़िगरेशन फ़ाइलें हैं जिनमें पासवर्ड हैं। मैंने सुनिश्चित किया है कि इस फ़ाइल को ट्रैक न करें और मैंने इसे .gitignore फ़ाइल में भी जोड़ा। हालांकि, मैं बिल्कुल सकारात्मक होना चाहता हूं कि कोई संवेदनशील जानकारी धकेलने वाली नहीं है, शायद कुछ ऐसा करने के दौरान या कुछ के बीच फिसल गया हो। मुझे संदेह है कि मैं ऐसा करने के लिए काफी लापरवाह था, लेकिन मैं सकारात्मक बनना चाहता हूं।एक स्ट्रिंग के लिए सभी गिट इतिहास खोजें?

क्या सभी गिट "grep" करने का कोई तरीका है? मुझे पता है कि अजीब लगता है, लेकिन "सब" से मुझे लगता है कि मेरा मतलब है कि बहुत ही फाइल का हर संस्करण जो कभी था। मुझे लगता है कि अगर कोई ऐसा आदेश है जो प्रत्येक प्रतिबद्धता के लिए diff फ़ाइल को डंप करता है, तो यह काम कर सकता है?

+0

यह सीमित है कि यह केवल एक ही शाखा (मास्टर?) खोजेगा, लेकिन यह https://github.com/divinity76/SearchGithubHistory.js/blob/master/SearchGithubHistory.js के करीब है/ – hanshenrik

+0

'सही उत्तर' के बावजूद, आपकी आवश्यकता यह जांचना है कि कुछ जानकारी सार्वजनिक रूप से नहीं की जाती है - 'गिट' उत्तर केवल तभी प्रासंगिक होता है जब आप पूरा इतिहास कर रहे हैं। बेशक यदि आप केवल इतिहास के बिना वर्तमान संशोधन करते हैं (उदाहरण के लिए। "गिट आर्काइव"), तो एक साधारण 'grep' पर्याप्त होगा। – MikeW

उत्तर

776

Git -S विकल्प के साथ डिफ खोज सकते हैं (यह गैंती in the docs कहा जाता है)

git log -Spassword 

यह किसी भी प्रतिबद्ध है कि जोड़ा या स्ट्रिंग password हटाया मिल जाएगा। यहां कुछ विकल्प दिए गए हैं:

  • -p: diffs दिखाएगा। यदि आप एक फ़ाइल (-p file) प्रदान करते हैं, तो यह आपके लिए एक पैच उत्पन्न करेगा।
  • -G: -S के विपरीत, जो जोड़ा गया या हटाया गया लाइन दिए गए रेगेक्सपी से मेल खाता है, जो "स्ट्रिंग के उदाहरण को पेश या निकालने वाले मतभेदों को देखता है" के अंतर को देखता है।
  • --all: सभी शाखाओं और टैगों पर खोजें; वैकल्पिक रूप से, सभी पिछले ट्रैक किए गए फ़ाइलों के अंदर स्ट्रिंग खोज करने के लिए --branches[=<pattern>] या --tags[=<pattern>]
+3

अगर कुछ हवाओं को प्रतिबद्ध करता है, तो क्या इसे हटाने का कोई आसान तरीका है? आइए मान लें कि इस परिदृश्य में एक कॉन्फ़िगरेशन फ़ाइल है जिसे मैं रखना चाहता हूं, लेकिन एक पंक्ति में एक पासवर्ड होता है, जिसे मैं अपने सभी गिट इतिहास से हटाना चाहता हूं। हर प्रतिबद्धता को फिर से लिखने के बिना ऐसा करने का कोई आसान तरीका? –

+2

@MattD हां, 'गिट रिबेस -i 'चाल चल जाएगा। प्रासंगिक प्रश्न: http://stackoverflow.com/questions/4963261/can-i-rebase-old-commits –

+2

हाय, 'गिट लॉग -Gpassword --all', केवल कुछ फ़ाइल खोजने के लिए स्थिति जोड़ने के लिए कैसे करें (एक देना फ़ाइल फ़ाइल नाम + फ़ाइलपैथ फ़िल्टर करने के लिए regex) – atian25

67
git rev-list --all | (
    while read revision; do 
     git grep -F 'password' $revision 
    done 
) 
+8

+1: मैंने "गिट रेप-लिस्ट में संशोधन के लिए" किया होगा - \ n; गिट grep ... किया गया ", लेकिन आपका दृष्टिकोण अधिक प्रतिक्रियाशील है, क्योंकि यह संशोधन मिलने के दौरान पकड़ता है। – EOL

+1

क्या यह रिमोट रिपोजिटरी (जैसे जिथब) पर इसका उपयोग करना संभव है? – studgeek

+1

@reesd: केवल अगर आप इसे क्लोन करते हैं, तो निश्चित रूप से। – cdhowie

16

का उपयोग निम्न कमांड का प्रयास करें:

git log --patch | less +/searching_string 

या

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' 

जो जरूरत मूल निर्देशिका से चलाने के लिए जहां आप खोज करना चाहते हैं।

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