Mercurial-просмотр всех наборов изменений, которые изменяют определенную строку в файле

Annotate позволяет вам увидеть самое последнее изменение в этой строке, если это изменение является слиянием, то у меня нет выбора, кроме как просмотреть историю изменений и найти следующий раз, когда она была изменена.

Я также пробовал hg grep -l '[contents of line]' но:

  • a) я не могу понять, как ориентироваться на конкретные файлы (так что это занимает навсегда в репо среднего размера)
  • b) кажется, что он возвращает только последний номер версии

следующий ссылка смутно похожа - как найти все changsets где ссылка, чтобы функция была изменена?

3 ответов


Использовать Tortoisehg:

  1. Вид -> Манифест
  2. Правой Кнопкой Мыши на файл и нажмите "журнал"
  3. нажмите "аннотировать с номерами ревизий"

верхняя панель позволяет быстро просмотреть историю файла с точки зрения коммитов, нижняя панель показывает аннотированный файл на основе выбранной версии в верхней панели.


использование ответа arielf без дополнительного скрипта:

UNIX:

  • :
    hg log --template '{rev}\n' <FILE> | 
         xargs -I @ hg grep <PATTERN> -r @ <FILE>
    
  • вы можете использовать это, чтобы добавить псевдоним в файле конфигурации (.hgrc):

    [alias]
    _grep_line_in_history = ! $HG log --template '{rev}\n'  | 
         xargs -I @ hg grep '' -r @ 
    

WINDOWS:

  • :
    FOR /F "usebackq" %i IN (`hg log --template "{rev}\n" <FILE>`) DO
    @(echo %i & hg grep <PATTERN> -r %i <FILE>)
    
  • псевдоним:

    [alias]
    _grep_line_in_history = ! FOR /F "usebackq" %i IN 
         (`%HG% log --template "{rev}\n" ""`) DO @(echo %i & %HG% grep "" -r %i "")
    

Я думаю, что это требует немного (двухэтапный) программирования.

следующий скрипт работает довольно хорошо для меня. Он печатает как ревизии, так и соответствующие строки. Если вам нужен только список ревизий, вы можете добавить шаг, чтобы удалить соответствующий текст и оставить только префикс ревизии и, возможно, передать "sort-u":

#!/bin/bash
#
# script to grep for a pattern in all revisions of a file
# Usage: scriptname 'pattern' filepath
#
function fatal() {
    echo "$@" 1>&2
    exit 1
}

function usage() {
    echo "$@" 1>&2
    fatal Usage:  pattern file
}

case "" in
    '') usage 'missing pattern to search for' ;;
    *)  Pat="" ;;
esac

if [ "" != '' ]; then
    File=""
else
    usage 'must pass file as 2nd argument'
fi

# -- generate list of revisions (change-sets) involving $File
for rev in `hg log --template '{rev}\n' $File`; do
    # -- grep the wanted pattern in that particular revision
    hg grep "$Pat" -r $rev $File
done

Примечания:

  • не полностью надежный (например, цитаты в шаблоне)
  • Я не проверяю файл существование для поддержки переименованных / удаленных файлов, а также