Есть ли Mercurial эквивалент git log --first-parent?
git log --first-parent
пропускает все, кроме первого родителя коммитов слияния.
Пример:
$ git log --oneline --graph
* 087f5ed Master C
* 36c50a2 Merge branch 'feature'
|\
| * 98c89df Feature B
| * 89b3a7b Feature A
* | 9a95133 Master B
|/
* 766c9b0 Master A
$ git log --oneline --graph --first-parent
* 087f5ed Master C
* 36c50a2 Merge branch 'feature'
* 9a95133 Master B
* 766c9b0 Master A
Есть ли Mercurial эквивалент?
4 ответа
Прямой эквивалент: hg log -r '_firstancestors(...)'
Существует прямой эквивалент: скрытый ревсет _firstancestors
следует за первой родительской (p1) стороной каждого слияния. В Mercurial, как и в Git, первым родителем является коммит, который был извлечен при hg merge [second parent]
назывался.
hg log -r '_firstancestors(myfeature)'
"скрытый" означает, что он начинается с подчеркивания и не указан в справке и т. д., но все же может использоваться, если вы знаете, что он существует. Я не знаю, почему это скрыто.
Примеры
Этот псевдоним revset перечисляет все коммиты в ветви объекта, игнорируя при этом все происхождение master
объединен с филиалом, чтобы привести его в актуальное состояние. (Магазин, в котором я работаю, предпочитает объединяться, а не перебазировать).
[revsetalias]
feature($1) = _firstancestors($1) and not _firstancestors(master)
[alias]
f = log -r "feature($(echo $HG_ARGS| sed 's/^f //'))"
Пример использования (использует мой собственный шаблон регистрации):
$ hg f myfeature
o 423 myfeature default/myfeature -- Esteis -- 2016-07-12 -- 123abc
| this
o 422 -- Esteis -- 2016-07-12 -- 123def
|\ merge master into myfeature
o ~ 421 -- Esteis -- 2016-07-12 -- 456abc
| that
o 420 -- Esteis -- 2016-07-12 -- 789def
| and the other
Вы можете использовать revsets для этого:
hg log -r "p1(merge())"
merge()
получает все коммиты слияния и p1()
получает первого родителя этих коммитов.
использование hg help revsets
чтобы получить больше информации о revsets.
>hg glog -r 410:426 --template "{rev} - {desc|firstline|fill68}\n"
o 426 - Merge test fixes for dulwich changes and output changes.
|\
| o 425 - Merge incoming fix.
| |\
| | o 424 - getremotechanges: fix incoming support
| | |
o | | 423 - overlay: stop using deprecated tree.entries() method
| | |
| o | 422 - Fix all-version-tests.
| | |
o | | 421 - Test output format tweaks for test-outgoing.
| | |
o | | 420 - test-incoming: fixes for hg 1.7
| | |
| o | 419 - Merge fix for `hg out` failing on empty repo.
| |\ \
| | o | 418 - In some situations where a reference is being used but does not
| | | | exist in _map_git or _map_hg, silently skip the reference rather
| | | | than throwing an error. This allows hg outgoing to work on
| | | | repositories which do not contain any revisions at all.
| o | | 417 - only want heads and tags
| |/ /
| o | 416 - test-url-parsing: update expecations missed by edaadbd99074
| | |
| o | 415 - to be recognized port number in path to repository
| | |
| o | 414 - Unbreak outgoing to non-git repos with hg pre-1.9
| | |
| o | 413 - test fixes for progress cleanup
| |/
| o 412 - Fix mercurial issue2855
| |
| o 411 - Convert dulwich progress into mercurial ui.progress
|/
o 410 - test-incoming: only run on hg 1.7.x and newer
Вместо крайне вырожденного случая из gist я использую часть реального хранилища DAG (hg-git repository). Надеюсь, выбор достаточно показателен для решаемой проблемы.
Необходимая версия (на простом английском) будет
"Диапазон A:B без второго родителя и его предков для наборов слияний"
В revset функциональный язык (TBT!)
-r "410::426 - (p2(merge()) or ancestors(p2(merge())))"
В случае полного набора ревизий в качестве исходного более читабельная форма будет выглядеть примерно так:
hg log -r "!(p2(merge()) or ancestors(p2(merge())))"
Редактировать 1
Я протестировал revset, переосмыслил методологию (вместо исключения я хочу добавить только необходимое к пустому набору), ближайшая итерация для моего варианта использования на данный момент (есть ошибки, не удается найти решение)
(p1(ancestors(p1(426))) or p1(426) or 426) and 410::426
которые (все еще) включают некоторые нежелательные изменения
hg log --follow-first
кажется, делает примерно то же самое, с несколькими положениями:
Это устарело (без объяснения, которое я могу найти).
Я не могу понять, как заставить его отображать что-либо, кроме прямой истории из текущего набора изменений (например, отображать историю после первого родителя из двух расходящихся головок (эквивалент
git log --first-parent branch-a branch-b
), хотя это может быть только из-за моего незнания Mercurial.Он показывает пустые ветки с
hg log -G
:$ hg log -G --template '{node|short} {desc|firstline}' @ 51b90923fc9d Master C | o bb51d979fd68 Merge branch 'feature' |\ | o a9ca2597ebbc Feature B | | | o d0a54af09272 Feature A | | o | 77ceb31100be Master B |/ o b5a0b2c7468f Master A $ hg log -G --template '{node|short} {desc|firstline}' --follow-first @ 51b90923fc9d Master C | o bb51d979fd68 Merge branch 'feature' |\ o | 77ceb31100be Master B |/ o b5a0b2c7468f Master A
Приведенный выше пример может показаться не слишком плохим, но см. https://gist.github.com/MaxNanasy/5184202 для примера, в котором это поведение выводит громоздкий вывод.
Эта проблема может не иметь большого значения, если проблема № 2 непреодолима, потому что тогда
hg log
без-G
будет единственным полезным способом использования--follow-first
AFAICT.