Как полный текст индексирует Mercurial-репозиторий?

Что делать, если hg log -k недостаточно, а hg grep слишком медленный (около 100 тыс. изменений)? У нас очень плохой опыт с Fisheye (слишком медленный), и Kiln, похоже, слишком сильно привязывает нас к империи FogCreek.

Какие еще существуют опции для обеспечения полнотекстового поиска в репозитории?

Ответ 1

Что вы ищете в полнотекстовом поиске? Если вы хотите узнать версию, когда текст был добавлен, это проще, и если вы хотите узнать все версии, в которых текст существует больше.

Как правило, hg grep работает так же быстро, как вы можете получить без предварительного создания индекса или, по крайней мере, для предварительно созданных версий файлов, на которые вы можете использовать традиционный grep.

Если вы хотите предварительно построить файловую структуру greppable, вы можете сделать что-то вроде этого:

hg export -o 'changeset-%r-%h.patch --rev 0:tip

Это будет экспортировать каждый набор изменений в текстовый файл, подходящий для grepping, используя обычную командную строку grep или индексирование с использованием lucene или аналогичного. Вы можете легко сохранить этот ток с помощью changeset.

Имея только отличия changset, вы можете искать исправления, где текст был добавлен или удален, но не список всех версий, где этот текст существовал. Для этого вы можете предварительно создать копию каждого файла при каждой ревизии, но это много места, даже если его легко автоматизировать.

Другой вариант, если вы ищете конкретную ревизию, когда что-то произошло, - убедитесь, что вы знакомы с hg bisect. Он автоматизирует двоичный поиск для вас, поэтому, если вы хотите найти первую ревизию с строкой CHEESE, вы можете сделать что-то вроде:

hg bisect --command "grep -s CHEESE" # might need to reverse the exit code of grep -s

хотя это обновляет рабочий каталог, который hg grep не поддерживает.