Может ли 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.)

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