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