linux - هل من الأفضل استخدام git grep بدلاً من grep العادي إذا كنا نريد البحث في التعليمات البرمجية المصدر المُصدرة؟



(4)

إذا كنت تبحث عن أنماط / سلاسل داخل مستودع git (على سبيل المثال في الملفات التي تم تتبعها بالفعل) ، فعندئذ ، نعم ، يجب أن يكون git grep أسرع كثيرًا بشكل نموذجي من grep المعتاد عند فهرسته. (يمكنك تجربة ذلك يدويًا ، يجب أن يكون git-grep أسرع بشكل ملحوظ)

https://src-bin.com

في مستودع git ، هل هناك أي فرق / فائدة باستخدام git grep على grep القديم الجيد؟
مثال سيكون؟


Answer #1

إذا كنت تبحث في Git repo ، فإن git grep يكون أسرع.

ومع Git 2.20 (Q4 2018) ، فإنه أيضًا أكثر توافقًا ، من حيث الخيار ، مع grep العادي.

كما تمت مناقشته في git grep "wishlist's" :

أستخدم في كثير من الأحيان " grep -r $pattern " لتكرار شجرة مصدر بشكل متكرر.
إذا استغرق ذلك وقتًا طويلاً ، فقد قمت بالضغط على ^C وعلامة " git " أمام سطر الأوامر وأعد تشغيله.
Git ثم يشكو " error: unknown switch r ' " because " git grep`" عودي بشكل طبيعي.

هل يمكننا قبول " git grep -r " الوسيطة للتوافق؟
رموز التبديل grep الهامة الأخرى مثل " -i " متوافقة ، مضيفًا أن -r شأنه تحسين قابليتها للاستخدام.

تم القيام بذلك الآن (Git 2.20 ، Q4 2018):

انظر الالتزام 0a09e5e (01 أكتوبر 2018) بقلم رينيه شارف ( rscharfe ) .
اقترح من قبل: gitster C هامانو ( gitster ) .
(دمج بواسطة Junio ​​C gitster - gitster - في الالتزام 9822b8f ، 19 أكتوبر 2018)

grep : add -r/--[no-]recursive

التعرف على -r و --recursive كمرادفات لـ --max-depth=-1 للتوافق مع GNU grep؛ لا يزال الافتراضي git grep .

يضيف هذا أيضًا --no-recursive كمرادف لـ --max-depth=0 مجانًا ، وهو موضع ترحيب من أجل الاكتمال والاتساق.

إصلاح وصف --max-depth ، بينما نحن فيه - قيم سالبة غير -1 تعطل فعليًا العودية ، أي أنها تعادل --max-depth=0 .


Answer #2

الميزة الرئيسية لـ git grep هي أنه يمكن العثور على الأنماط الموجودة في مستودع git ، أي أيضًا في أنماط أخرى غير الإصدار الحالي للمصدر. لا يمكن القيام بذلك باستخدام معيار grep بالطبع. هناك أيضًا الكثير من الميزات في git grep مثل الحسابي لـ pattern (أشياء مثل git grep -e pattern1 --and --not \( -e pattern2 -e pattern3 \) ) ، البحث عن الأشجار باستخدام glob (أشياء مثل git grep pattern -- '*.[ch]' للبحث فقط في ملفات .c و .h ) وبعضها الآخر.

فيما يلي جلسة مثال للبحث في مراجعة أقدم:

$ mkdir git-test                 # create fresh repository
$ cd git-test/
$ git init .
Initialized empty Git repository in /home/alfe/git-test/.git/
$ echo eins zwei drei > bla      # create example file
$ git add bla                    # add and commit it
$ git commit bla
[master (root-commit) 7494515] .
 1 file changed, 1 insertion(+)
 create mode 100644 bla
$ echo vier fuenf sechs > bla    # perform a change on that file
$ git commit -m 'increase' bla   # commit it
[master 062488e] increase
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git grep eins | cat            # grep for outdated pattern in current version
                                  # (finds nothing)
$ git grep eins master^ | cat    # grep for outdated pattern on former version
                                  # finds it:
master^:bla:eins zwei drei

Answer #3

يبحث git grep فقط في الملفات المتعقبة في الريبو.

مع grep يتعين عليك تمرير قائمة الملفات للبحث فيها وتصفية أي ملفات غير مكتوبة بنفسك.

لذلك إذا كنت تبحث عن شيء تعرفه في الريبو ، فإن git grep يوفر عليك الوقت لأن كل ما عليك فعله هو تقديم النموذج. كما أنه مفيد لعدم الاضطرار إلى البحث من خلال أي شيء لم يتم تعقبه في الريبو.





grep