Mercurial - файлы, измененные в текущей ветке

Можете ли вы помочь мне создать правильный revset для Mercurial hg status? Я хотел бы перечислить все файлы, которые были изменены в текущей ветке с момента ее создания. Я старался

hg status --rev "branch(foo)"

где foo имя моей ветки, но в ней также перечислены файлы, которые были изменены в ветке, из которой была создана моя ветка (?). Я не понимаю, как создать правильный revset для этого.

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

1 ответ

Решение

Это кажется довольно простым (см. hg help revsets а также hg help revisions откуда это взялось).

Мы могли бы начать с набора всех коммитов в ветке, например, для ветки foo:

-r 'branch(foo)'

Очевидно, что это может привести к десяток или даже миллиону пересмотров; но вы хотите увидеть, что произошло между "созданием ветки" - которая должна проверить родителя первой такой ревизии - и "текущим состоянием ветки", которая должна проверить последнюю такую ​​ревизию.

Первая1 ревизия большого набора получается first() и последний по last(), Однако, когда различным командам присваивается спецификатор ревизии, они выглядят как одна ревизия, и здесь в любом случае достаточно имени ветки, чтобы присвоить имя последней фиксации в ветке.

Чтобы получить (первого) родителя ревизии, мы используем p1() функция (суффикс ^ допускается только для буквальной ревизии, но не для функции, которая возвращает ревизию). Отсюда родитель первой ревизии на ветке foo является:

-r 'p1(first(branch(foo)))'

Чтобы получить полную разницу между последним коммитом в ветке:

hg diff -r 'p1(first(branch(foo)))' -r 'foo'

Но вам не нужен полный diff, вам нужны имена файлов. Команда, которая производит это hg statusи имеет немного другой синтаксис:

hg status --rev 'p1(first(branch(foo)))' --rev 'foo'

Статус включает в себя буквы на передней панели, а также имена: A для вновь добавленных файлов, M для измененных файлов и так далее. Обратите внимание на использование --rev а не просто -r (на самом деле, вы можете использовать --rev с hg diff также).

Обратите внимание, что есть гораздо более короткий синтаксис, ::foo, который получает всех предков данной ветки вплоть до последней ревизии в названной ветке включительно. Тем не менее, это получает слишком много предков. Вы можете, однако, использовать p1(first(branch(foo)))::foo в качестве (целого) аргумента --revи это тоже работает. так:

hg status --rev 'p1(first(branch(foo)))::foo`

это немного более короткий способ выразить это.

Наконец, обратите внимание, что сравнение первого коммита в ветке с последним (как это происходит с hg status --rev 'first(branch(foo))' --rev fooнапример) может пропустить изменения, сделанные в этом первом коммите в ветви. Вот почему мы используем p1 Вот.


1first Функция выбирает первую в наборе, которая может отличаться от первой числовой ревизии. Например, предположим, что набор сделан из x | y и пересмотр в y численно ниже, чем ревизия в xили вы используете reverse(branch(foo)) разместить коммиты в порядке убывания. В этом случае, min вместо first будет функция для использования.

Другие вопросы по тегам