Поиск всей истории Git для строки?

У меня есть кодовая база, которую я хочу отправить в GitHub в качестве открытого источника. В этом исходном дереве, управляемом git, у меня есть определенные файлы конфигурации, которые содержат пароли. Я проследил, чтобы этот файл не отслеживался, и добавил его в .gitignore файл. Тем не менее, я хочу быть абсолютно уверенным в том, что никакая конфиденциальная информация не будет передана, возможно, если что-то проскользнет между коммитами или что-то в этом роде. Я сомневаюсь, что был достаточно небрежен, чтобы сделать это, но я хочу быть позитивным.

Есть ли способ "grep" всех мерзавцев? Я знаю, что это звучит странно, но под словом "все" я думаю, я имею в виду каждую версию самого файла, которая когда-либо была. Я думаю, если есть команда, которая выдает файл diff для каждого коммита, это может сработать?

3 ответа

Решение

Git может искать различия с опцией -S (в документах она называется киркой)

git log -Spassword

Это найдет любой коммит, который добавил или удалил строку password, Вот несколько вариантов:

  • -p: покажет различия. Если вы предоставите файл (-p file), он сгенерирует для вас патч.
  • -G: ищет различия, чья добавленная или удаленная строка соответствует заданному регулярному выражению, в отличие от -S, который "ищет различия, которые вводят или удаляют экземпляр строки".
  • --all: поиск по всем веткам и тегам; в качестве альтернативы, используйте --branches[=<pattern>] или же --tags[=<pattern>]
git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)

Попробуйте выполнить следующие команды для поиска строки во всех предыдущих отслеживаемых файлах:

git log --patch  | less +/searching_string

или же

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

который должен быть запущен из родительского каталога, в котором вы хотите выполнить поиск.

Другие вопросы по тегам