Искать всю историю Git для строки?

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

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

Ответ 1

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

git log -Spassword

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

  • -p: покажет различия. Если вы предоставите файл (файл -p file), он сгенерирует для вас патч.
  • -G: ищет различия, чья добавленная или удаленная строка соответствует данному регулярному выражению, в отличие от -S, который "ищет различия, которые вводят или удаляют экземпляр строки".
  • --all: поиск по всем веткам и тегам; в качестве альтернативы используйте --branches[=<pattern>] или --tags[=<pattern>]

Ответ 2

git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)

Ответ 3

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

git log --patch  | less +/searching_string

или

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

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