Ответ 1
Если у вас есть Unix-подобная оболочка, ответ довольно прост:
git grep --cached "debugger" $(git diff --cached --name-only)
Это запустит git grep
в списке промежуточных файлов.
Итак, перед запуском git commit
я часто запускаю следующее:
git grep --cached -l -I "debugger"
Я думал, что это похоже на:
git diff --cached
(который покажет вам все изменения, которые вы собираетесь совершить, т.е. покажет вам diff в ваших поставленных файлах).
К сожалению, я просто обнаружил, что параметр --cached
для git grep
просто сообщает git "только" посмотреть на все в своем индексе.
Итак, как я могу запустить git grep
и иметь его только 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
, чтобы получить diff, иначе он просто идентифицирует повреждающий файл.
Сначала вам нужно получить список файлов из индекса (исключая удаленные файлы). Это можно сделать следующим образом:
git diff --cached --name-only --diff-filter=d HEAD
Во-вторых, вам нужно использовать префикс: для доступа к содержимому файла в текущий индекс (поставленный, но еще не зафиксированный) см. gitrevisions руководство для получения дополнительной информации.
git show :<file>
Наконец, вот пример объединения всех этих файлов в grep этот список файлов
# 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 contents for 'some pattern'
for file in ${file_list}; do
git show :"${file}" | grep 'some pattern'
done
Также здесь пример проводника pre-commit git, который использует этот метод для проверки того, что годы авторского права актуальны в файлах, которые необходимо выполнить.