git - كيف grep(البحث) ارتكبت رمز في تاريخ بوابة؟



diff (9)

@ يعمل إجابة جيت في PowerShell.

git grep -n <regex> $(git rev-list --all)

يعرض ما يلي جميع الملفات ، في أي التزام ، والتي تحتوي على password .

# store intermediate result
$result = git grep -n "password" $(git rev-list --all)

# display unique file names
$result | select -unique { $_ -replace "(^.*?:)|(:.*)", "" }

لقد قمت بحذف ملف أو بعض الأكواد في ملف في وقت ما في الماضي. هل يمكنني الضغط على المحتوى (وليس في رسائل الالتزام)؟

الحل الضعيف للغاية هو الضغط على السجل:

git log -p | grep <pattern>

ومع ذلك ، فإن هذا لا يعيد التجزئة على الفور. لعبت مع git grep دون جدوى.


Answer #1

أخذت جواب @ جيت و adpated إلى ويندوز (بفضل هذه الإجابة ):

FOR /F %x IN ('"git rev-list --all"') DO @git grep <regex> %x > out.txt

لاحظ أنه بالنسبة لي ، لسبب ما ، لم يظهر الالتزام الفعلي الذي حذف هذا regex في إخراج الأمر ، ولكن أحدا يلتزم قبل ذلك.


Answer #2

إذا كنت ترغب في تصفح تغييرات التعليمات البرمجية (انظر ما تم تغييره بالفعل باستخدام الكلمة المحددة في السجل بالكامل) ، فانتقل إلى وضع patch - لقد وجدت مجموعة مفيدة جدًا من الإجراءات:

git log -p
# hit '/' for search mode
# type in the word you are searching
# if the first search is not relevant hit 'n' for next (like in vim ;) )

Answer #3

إذاً هل تحاول اختراق grep من خلال الإصدارات القديمة من الشفرة التي تبحث عن مكان آخر شيء موجود؟

لو كنت أفعل هذا ، ربما كنت سأستخدم git chais . باستخدام bisect ، يمكنك تحديد إصدار جيد معروف ، وإصدار شرير معروف ، وسيناريو بسيط يقوم بفحص لمعرفة ما إذا كان الإصدار جيدًا أو سيئًا (في هذه الحالة ، grep لمعرفة ما إذا كان الرمز الذي تبحث عنه موجودًا أم لا) ). يؤدي تشغيل هذا إلى العثور على الرمز الذي تمت إزالته.


Answer #4

بالنسبة إلى البساطة ، أقترح استخدام واجهة المستخدم الرسومية (GUI): gitk - متصفح مستودع Git ، وهو مرن جدًا

  1. للبحث في الكود:
  2. للبحث في الملف:
  3. لأنه يدعم أيضًا regex:

ويمكنك التنقل خلال النتائج باستخدام سهم أعلى / أسفل


Answer #5

في حالتي كنت بحاجة للبحث في "الالتزام قصير" والحلول المذكورة للأسف لا تعمل.

تمكنت من القيام بذلك مع: (استبدال رمز REGEX )

for commit in $(git rev-list --all --abbrev-commit)
do
    if [[ $commit =~ __REGEX__ ]]; then 
        git --no-pager show -s --format='%h %an - %s' $commit
    fi
done

Answer #6

للبحث عن محتوى الالتزام (على سبيل المثال ، خطوط المصدر الفعلية ، في مقابل رسائل الالتزام وما شابه) ، ما عليك القيام به هو:

git grep <regexp> $(git rev-list --all)

التحديثات : git rev-list --all | xargs git grep expression سوف يعمل git rev-list --all | xargs git grep expression إذا قمت بتشغيل إلى خطأ "قائمة وسيطة طويلة جداً"

إذا كنت ترغب في قصر البحث على بعض الشجرة الفرعية (على سبيل المثال "lib / util") ، فستحتاج إلى تمرير ذلك إلى rev-list rand rev-list و grep أيضًا:

git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

هذا سوف grep من خلال كل نص التزامك ل regexp.

سبب تمرير المسار في كلا الأمرين هو أن rev-list المراجعة ستعرض rev-list المراجعات حيث حدثت جميع التغييرات على lib/util ، ولكنك تحتاج أيضًا إلى الانتقال إلى grep بحيث يتم البحث فقط في lib/util .

فقط تخيل السيناريو التالي: قد تجد grep نفس <regexp> على الملفات الأخرى المضمنة في نفس المراجعة التي rev-list المراجعة (حتى إذا لم يكن هناك تغيير في ذلك الملف في تلك المراجعة).

فيما يلي بعض الطرق المفيدة الأخرى للبحث في المصدر الخاص بك:

ابحث عن شجرة العمل للنص الذي يطابق التعبير العادي عن التعبير العادي:

git grep <regexp>

ابحث عن شجرة العمل لخطوط النص التي تطابق التعبير العادي regexp1 أو regexp2:

git grep -e <regexp1> [--or] -e <regexp2>

ابحث عن شجرة العمل لخطوط نصية مطابقة للتعبير العادي regexp1 و regexp2 ، ومسارات ملف التقارير فقط:

git grep -e <regexp1> --and -e <regexp2>

البحث في شجرة العمل للملفات التي تحتوي على أسطر نص مطابقة للتعبير العادي regexp1 وخطوط نص مطابقة التعبير العادي regexp2:

git grep -l --all-match -e <regexp1> -e <regexp2>

البحث في شجرة العمل للخطوط المتغيرة لنمط مطابقة النص:

git diff --unified=0 | grep <pattern>

ابحث في جميع المراجعات للنص الذي يطابق التعبير العادي عن التعبير العادي:

git grep <regexp> $(git rev-list --all)

البحث في جميع المراجعات بين rev1 و rev2 للنص الذي يطابق التعبير العادي التعبير العادي:

git grep <regexp> $(git rev-list <rev1>..<rev2>)

Answer #7

يجب عليك استخدام الخيار ( -S ) git log من git log

للبحث عن Foo :

git log -SFoo -- path_containing_change 
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change

انظر تاريخ Git - اعثر على السطر المفقود بكلمة مفتاحية لمعرفة المزيد.

كما علق Jakub Narębski :

  • هذا يبحث عن الاختلافات التي تقدم أو إزالة مثيل من <string> .
    عادةً ما تعني "المراجعات التي أضفت أو أزلت فيها سطرًا بـ" Foo ".

  • يتيح لك الخيار --pickaxe-regex موسع لـ POSIX بدلاً من البحث عن سلسلة.

وكما علق Rob ، فإن هذا البحث حساس لحالة الأحرف - فقد فتح سؤال متابعة حول كيفية البحث عن حساسية لحالة الأحرف.


Answer #8
git rev-list --all | xargs -n 5 git grep EXPRESSION

عبارة عن قرص إلى حل @ Jeet بحيث يظهر النتائج أثناء البحث وليس فقط في النهاية (والذي يمكن أن يستغرق وقتًا طويلاً في ريبو كبير).





diff