Как grep через ваши поставленные файлы до совершения?

Итак, перед запуском git commit я часто запускаю следующее:

git grep --cached -l -I "debugger"

Я думал, что это похоже на:

git diff --cached

(который покажет вам все изменения, которые вы собираетесь совершить, т.е. покажет вам diff в ваших поставленных файлах).

К сожалению, я просто обнаружил, что параметр --cached для git grep просто сообщает git "только" посмотреть на все в своем индексе.

Итак, как я могу запустить git grep и иметь его только grep через мои поэтапные файлы?

(Да, я знаю, что могу просто сделать git diff --cached и искать в нем, но я предпочел бы, чтобы программные возможности grep через мои поэтапные файлы.)

Ответ 1

Если у вас есть Unix-подобная оболочка, ответ довольно прост:

git grep --cached "debugger" $(git diff --cached --name-only)

Это запустит git grep в списке промежуточных файлов.

Ответ 2

В большинстве перехватов для фиксации используйте git diff-index --cached -S<pat> REV, чтобы найти изменения, которые добавляют или удаляют определенный шаблон. Итак, в вашем случае git diff-index --cached -Sdebugger HEAD. Вы можете добавить -u, чтобы получить diff, иначе он просто идентифицирует повреждающий файл.

Ответ 3

Сначала вам нужно получить список файлов из индекса (исключая удаленные файлы). Это можно сделать следующим образом:

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, который использует этот метод для проверки того, что годы авторского права актуальны в файлах, которые необходимо выполнить.