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
будет функция для использования.