Может ли Mercurial (Hg) показать мне, откуда удаленная ветка или коммит?
У меня есть репозиторий Mercurial (Hg) с 2 пультами, давайте назовем их default
а также upstream
,
Я вытащил из обоих пультов и хотел бы знать, какие коммиты / ветви пришли с удаленного вызова default
а какие коммиты / ветки пришли с пульта под названием upstream
, Как мне добиться этого в Hg?
В идеале я хотел бы использовать hg log
Команда так же, как я использую git log --describe --all
команда, с которой я более знаком.
Есть ли шаблон для hg log
команда, которая эквивалентна git log --describe
?
Примечание: я уже знаю об использовании hg out <remote>
чтобы показать мне, какой набор коммитов недоступен на пульте, который меня интересует, но я надеялся на что-то более визуальное.
2 ответа
Без гигантских изменений в стандартном рабочем процессе HG (предполагается, что в другом расширении, remotenames), в стиле по умолчанию, вы можете добавить расширение удаленных веток в свой Mercurial.
Я вытащил из обоих пультов и хотел бы знать, какие коммиты / ветви пришли с удаленного вызова
default
а какие коммиты / ветки пришли с пульта под названиемupstream
, Как мне добиться этого в Hg?
В общем, вы не можете. (Но см. Ниже и предложенное расширение для Lazy Badger.)
Git на самом деле тоже не делает этого. Тем не менее, вы можете, как вы сказали:
... используйте команду git log --describe --all...
Это не говорит вам, кто доставил вам коммиты. Вместо этого он сообщает вам, какая из ваших ссылок "ближе всего" к описываемому коммиту ("ближайший" определяется неопределенным образом ручной волны). Что делает Git, чего не делает Mercurial, так это создает в вашем хранилище конкретные ссылки - имена для удаленного отслеживания, такие как remote1/branch
а также remote2/branch
- помните, какой коммит был идентифицирован по имени branch
на remote1 и remote2 соответственно.
При условии, что именно один из двух пультов имеет эти коммиты в первую очередь, только одна такая ссылка может быть "ближайшей". Git выберет тот, и из этого вы можете определить, кто имеет коммиты, а кто нет. Он терпит неудачу или может потерпеть неудачу, если оба пульта имеют коммиты: вы получаете произвольную ссылку (которая может быть в любом случае достаточной в зависимости от вашей основной цели).
Теперь вы можете что- то сделать. В частности, проблема в этом случае заключается в том, что имена веток Mercurial являются глобальными, а коммиты постоянно приклеиваются к ветке, на которой они были сделаны. Если вы подключаетесь к remote1 и получаете некоторые коммиты, у них есть любой хеш-идентификатор и имя ветки, и ваш Mercurial сохраняет их в вашем хранилище под тем же хеш-идентификатором и под тем же именем - и теперь Mercurial (как Git) забывает источник потому что теперь это ваши коммиты.
Но вы знаете, что любые коммиты, которые только что поступили (если есть), были получены с remote1, а не с remote2. Более того, если какие-либо коммиты поступили, они увеличат локальный номер ревизии (-r -n tip
). Вы можете сохранить этот новый номер или даже весь промежуток где-нибудь. Все эти коммиты в этом промежутке, от "старого наконечника + 1" до "нового наконечника" включительно, были получены с пульта remote1.
Повторите это для remote2: все новые коммиты, которые поступают, приходят от них.
(Есть и другой вариант, но он радикальный: вы можете использовать расширение Convert для изменения имен веток коммитов по мере их поступления. Однако, если вы сделаете это, вы застрянете с этими коммитами, находящимися в другой ветке: у вас будет чтобы скопировать, т. е. перехватить или перебазировать, коммиты переместят их в свои исходные ветви позже, если вы этого захотите. Существуют дополнительные и лучшие расширения, но, в отличие от Convert, они не распространяются вместе с Mercurial.)