Як здійснити пошук у сховищі Git за допомогою повідомлення?


828

Я перевірив деякий вихідний код у GIT із повідомленням фіксації "Build 0051".

Однак я не можу більше знайти цей вихідний код - як я витягаю це джерело з сховища GIT, використовуючи командний рядок?

Оновлення

  1. Перевіряється у версіях 0043, 0044, 0045 та 0046 за допомогою SmartGIT.
  2. Перевірено 0043 та перевірено у версіях до 0051 на іншій гілці.
  3. Знову перевірили 0043.
  4. Тепер 0051 зник.

Оновлення

Вихідний код, безумовно, є, тепер питання його перевірити:

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>




2
Відповіді не належать до питань щодо переповнення стека. Ви досить довго працювали в дописі, щоб вам це було відомо. Якщо ви хочете дати відповідь на власне запитання, вам це неодмінно приємно зробити . Можна також відредагувати відповідь шелхамера, щоб покращити / розширити її.
Коді Грей

1
@Cody Я посилаюся на цю публікацію періодично. Ви не можете просто випадковим чином видалити текст, це просто не крикет. Якщо ви хочете видалити його, ви, безумовно, можете переключити його на свою власну відповідь (і, можливо, ви навіть отримаєте кілька оновлень для цього - ви вже досить довго працювали, щоб знати, як це працює).
Контанго

Відповіді:


1280

Для пошуку в журналі фіксування (у всіх відділеннях) для цього тексту:

git log --all --grep='Build 0051'

Для пошуку фактичного вмісту комісій через історію репо використовуйте:

git grep 'Build 0051' $(git rev-list --all)

щоб показати всі екземпляри даного тексту, ім'я, що містить файл, і виконувати sha1.

Нарешті, в крайньому випадку, якщо ваш вчинок звисає і зовсім не пов’язаний з історією, ви можете шукати сам рефлог із -gпрапором (скорочено --walk-reflogs:

git log -g --grep='Build 0051'

РЕДАКТУЙТЕ: якщо вам здається, що ви втратили свою історію, перевірте reflogсвою безпеку. Шукайте Build 0051 в одному з комітетів, перерахованих

git reflog

Можливо, ви просто встановили свою HEADчастину історії, в якій команда 'Build 0051' не видно, або ви, можливо, насправді здули. Стаття з рефлогом, готовою до git, може допомогти.

Щоб відновити свою комісію з рефлогу : виконайте git-перевірку знайденого вами комітету (і необов'язково зробіть нову гілку або тег для довідки)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@{10}
git checkout -b build_0051 # make a new branch with the build_0051 as the tip

2
з git grep 'Build 0051' $ (git rev-list - всі) я отримую sh.exe ": / bin / git: Неправильний номер файлу може змінити спосіб цього?
Jens Schauder

7
git log -i -grep
jhvaras

@JensSchauder Якщо ви зіткнулися з помилкою git grep 'search' $(git rev-list --all), спробуйтеgit rev-list --all | xargs git grep 'search'
afilina

83

Я вкладаю це у свою ~ / .gitconfig:

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

Тоді я можу набрати "git find string", і я отримаю список усіх комітетів, що містять цей рядок у повідомленні. Наприклад, щоб знайти всі комісії із посиланням на квиток № 33:

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php

1
Хороший, але, можливо, відсутній скидання кольору? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ешлі Кулман

4
Я вважаю за краще , щоб надрукувати повне повідомлення GIT (Grep може бути там сталося, не в назві), так що я закінчив з: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Зверніть увагу на --allі %bсимволи. Thx @AshleyCoolman для поради reset.
arcol

Дякую. Псевдонім я вважав дуже корисним. Мені не сподобалося забарвлення і я знайшов формат в одній лінії ідеально підходить для цього. Також було корисним додавання -i, щоб зробити його нечутливим до регістру. наприкладfind = log --oneline --name-status -i --grep
robbp

39

Хоча трохи пізно, є :/специфічне позначення для визначення коміті (або перегляду) на основі повідомлення про фіксацію, просто вставте рядок пошуку :/, наприклад:

git show :/message

Тут <message>може бути складна схема регулярного вираження, що складається з пробілів, тому, будь-ласка, обов'язково цитуйте / уникайте, коли це необхідно, наприклад:

git log -1 -p ":/a few words"

Альтернативно, можна вказати початкову точку, щоб знайти найближчий фіксатор, доступний з певної точки, наприклад:

git show 'HEAD^{/fix nasty bug}'

Див. Посібник з редагування git .


23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).

19
git log --grep="Build 0051"

повинен зробити трюк


1
Доведеться використовувати подвійні лапки (") замість одинарних лапок (").
frage

9

Спробуйте це!

git log | grep -b3 "Build 0051"

Дякую - але його не знаходять. Як здійснити пошук у всіх можливих галузях?
Контанго

6
Ви хочете використовувати git grepзамість звичайного grep та надати --allпрапор для пошуку кількох гілок.
шельхамер

Хм - чи інші відповіді це знаходять? Якщо ні, то у вас може бути більша проблема. Я б спробував git log --all --grep='Build 0051'(@ відповідь шелхамера)
Nic

Я спробував "git log --all", і він містить лише версії до 0046. Версія 0051 була на іншій гілці. Я відкотився до 0043, і 0051 зник.
Контанго

3
@Gravitas, спробуй мій приклад, який використовує рефлог: той, з git log -g. Можливо, ви втратили історію під час скидання, але ви все одно можете перевірити виправлення, чи не було зібрано сміття.
шельхамер

4

спочатку використовуйте git log --onelineдля пошуку SHA комітету (Повідомлення), потім я використовував git log --stat 8zad24dразом із SHA (перший приклад для ша-пара (8zad24d)), щоб знайти потрібну інформацію


1

Це:

git log --oneline --grep='Searched phrase'

або це:

git log --oneline --name-status --grep='Searched phrase'

команди найкраще працюють для мене.


1

Для пошуку в усіх галузях

git log --all --grep='Build 0051'

Як тільки ви дізнаєтеся, до якого зобов’язання ви хочете потрапити

git checkout <the commit hash>

1

Якщо зміна не надто стара, ви можете зробити це,

git reflog

а потім перевірити ідентифікатор фіксації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.