سؤال

لذلك قبل الجري 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 قبل الالتزام الذي يستخدم هذه الطريقة للتحقق من أن سنوات حقوق الطبع والنشر محدثة في الملفات المراد ارتكابها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top