Git: получить все капли с рисунком - PullRequest
6 голосов
/ 17 августа 2011

В Git, как найти идентификаторы SHA-1 всех больших двоичных объектов в базе данных объектов, которые содержат строковый шаблон? git-grep предоставляет только пути к файлам, а не идентификаторы sha1.

Ответы [ 4 ]

4 голосов
/ 30 июня 2016

Я сделал следующее, чтобы выяснить, был ли какой-то написанный мной код потерян навсегда или, возможно, скрыт в каком-то «недоступном» коммите:

# Assuming you're at the root of the git repository
> cd .git/objects
# Search all objects for a given string (assuming you're in .git/objects)
> find ?? -type f | sed s!/!! | git cat-file --batch | grep --binary-files=text <SEARCH_STRING>

Это выдаст результат, если any объект git содержит <SEARCH_STRING>.Тем не менее, он не скажет вам, какой объект содержит его.Но, сделав это, я нашел свой недостающий код и в конце концов смог его вернуть.

4 голосов
/ 13 мая 2016

РЕДАКТИРОВАТЬ: обновление на основе новых результатов тестирования с использованием Git версии 2.7.4

Похоже, что решение, которое я выложил, проходит только через reflog.Поэтому, если вы удалите запись reflog, эта запись не будет просматриваться - даже если объект все еще существует.

Так что вам придется сделать что-то вроде:

{
    git rev-list --objects --all --grep="text"
    git rev-list --objects -g --no-walk --all --grep="text"
    git rev-list --objects --no-walk --grep="text" \
        $(git fsck --unreachable |
          grep '^unreachable commit' |
          cut -d' ' -f3)
} | sort | uniq

Получено из: Git - как составить список ВСЕХ объектов в базе данных

Старое решение: работает, только если объект находится в reflog

Чтобы найти строку "text"во всех локальных объектах:

git log --reflog -Stext

Чтобы найти шаблон" шаблона "во всех локальных объектах:

git log --reflog --grep=pattern

Это будет искать во всех объектах, поэтому будет работать, даже есликоммит / ветка удалена.После удаления объекта из локального хранилища (например, через gc) он больше не будет включен в поиск.

3 голосов
/ 17 августа 2011

Вы можете попробовать git log, используя опцию кирки:

git log -Sstring --all

См. " Как найти коммит SHA1 для дерева, содержащего файл, содержащий данную строку "

0 голосов
/ 17 августа 2011

Я не могу удалить этот ответ, потому что он был принят, но ответ Скаара лучше отвечает на вопрос ОП.(Это все еще необычная вещь, которую нужно сделать, но я вижу, что есть причины, по которым вам может понадобиться.)

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