كيف grep من خلال ملفاتك المرحلية قبل الالتزام؟
-
29-09-2019 - |
سؤال
لذلك قبل الجري git commit
غالبًا ما أقوم بتشغيل ما يلي:
git grep --cached -l -I "debugger"
اعتقدت أنها كانت مشابهة ل:
git diff --cached
(والتي ستظهر لك كل التغييرات التي توشك على الالتزام بها ، أي سيظهر لك الفرق في الملفات المرحلية).
لسوء الحظ ، وجدت أن --cached
خيار ل git grep
ببساطة يخبر Git بـ "فقط" إلقاء نظرة على كل شيء في فهرسه.
فكيف يمكنني الجري git grep
ولديها فقط من خلال ملفاتي المرحلية؟
(نعم ، أعلم أنه يمكنني القيام ببساطة git diff --cached
وابحث في ذلك ، لكنني أفضل أن أحصل على القدرة البرمجية على grep من خلال ملفاتي المرحلية.)
المحلول
إذا كان لديك قذيفة تشبه Unix متوفرة ، فإن الإجابة بسيطة جدًا:
git grep --cached "debugger" $(git diff --cached --name-only)
هذا سوف يعمل git grep
في قائمة الملفات المرحلية.
نصائح أخرى
الكثير من استخدام السنانير قبل الالتزام git diff-index --cached -S<pat> REV
للعثور على التغييرات التي تضيف أو إزالة نمط معين. لذلك في قضيتك ، git diff-index --cached -Sdebugger HEAD
. قد ترغب في إضافة -u
للحصول على فرق أيضًا ، وإلا فإنه يحدد الملف المخالف فقط.
تحتاج أولاً إلى الحصول على قائمة بالملفات من الفهرس (باستثناء الملفات المحذوفة). يمكن القيام بذلك بما يلي:
git diff --cached --name-only --diff-filter=d HEAD
ثانيًا ، تحتاج إلى استخدام: بادئة للوصول إلى محتويات ملف في الفهرس الحالي (تم ترحيله ولكن لم يلتزم بعد) انظر دليل Gitrevisionللمزيد من المعلومات.
git show :<file>
أخيرًا ، إليك مثال على وضع كل شيء معًا لتخليص قائمة الملفات هذه
# Get a list of files in the index excluding deleted files
file_list=$(git diff --cached --name-only --diff-filter=d HEAD)
# for each file we found grep it's contents for 'some pattern'
for file in ${file_list}; do
git show :"${file}" | grep 'some pattern'
done
ايضا هذا مثال من خطاف GIT قبل الالتزام الذي يستخدم هذه الطريقة للتحقق من أن سنوات حقوق الطبع والنشر محدثة في الملفات المراد ارتكابها.