Как найти коммит SHA1 дерева, содержащего файл, содержащий заданную строку - PullRequest
2 голосов
/ 10 августа 2010

Это ситуация: я потерял некоторую работу в своем git-репозитории, эта работа когда-то была зафиксирована, но теперь похоронена в моей истории, где-то, что может быть недоступно для 'git log --all' . Единственное, что я могу вспомнить, это какая-то отдельная строка, которая может точно определить файл, который является частью моей работы в настоящее время.

У меня есть решение ... но оно довольно длинное, у вас есть лучшее решение?

Это мое решение:

Мне удалось найти свой коммит SHA1, выполнив несколько команд:

  • сначала находит все объекты 'blob' в .git / objects, 'git cat' их (и использует grep), чтобы найти SHA1 BLOB-объекта, который содержал мой файл.
  • Затем мне пришлось проанализировать все объекты «дерева», чтобы найти, которые содержали SHA1 файла ... до объекта дерева, который не содержался ни в каких других объектах «дерева».
  • Для окончательного анализа всех коммитов, содержащих это корневое дерево.

1 Ответ

7 голосов
/ 10 августа 2010

Если фиксация возможна из некоторой ссылки, оптимальным решением будет поиск кирки: git log -Sstring --all.

Если это недостижимо, вы правы, вам придется немного покопаться. Если вы думаете, что повсюду разбросаны коммиты, проще всего использовать git fsck --lost-found, чтобы найти свои коммиты. (Он также будет печатать висячие капли.) Затем вы можете использовать git grep <commit> на каждом из этих SHA1 и найти свою строку.

С другой стороны, если вы думаете, что у вас есть несколько веток-кандидатов, которые были сокращены, и ваша цель будет на одном из них, я бы использовал git reflog show, чтобы оглянуться назад на ваши reflogs, найти коммиты, которые были на кончиках их, и воссоздайте их, чтобы вы могли сделать git log -Sstring <branches> ^master.

...