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