Как получить набор меток после того, как вы клонируете или используете тег Mercurial? - PullRequest
7 голосов
/ 22 сентября 2010

Как определенно указывает удачно указывает (поиск "Теги и клонирование"):

Когда вы запускаете hg clone -r foo, чтобы клонировать репозиторий с тегом foo, новый клон не будет содержать ревизии новее, чем та, на которую ссылается тег, включая ревизию, в которой был создан тег. В результате вы будете получить именно правильное подмножество истории проекта в новом хранилище, но не тег , который вы могли ожидать.

Это означает, что hg tags в вашем новом клоне НЕ показывает тег foo. То же самое происходит, если вы клонировали до того, как тег foo был добавлен, и вы делаете hg pull -r foo.

(Digression: тег - это единственное, что я не совсем понимаю в hg. Я понимаю, что есть преимущества (например, слияние) в том, чтобы поместить его в набор изменений, но всегда странно, когда метаданные смешиваются с исходным кодом .)

Должно быть очевидно, что я прошу об автоматическом способе, вместо того, чтобы тянуть набор изменений тега как отдельный ручной шаг.

Я знаю, что мог бы проверить этот сценарий в incoming хуке (чтобы он работал как для клонов, так и для извлечения), или обернуть clone и pull.

Но есть ли лучший / более простой способ?


UPDATE hg bug tracker уже имеет эту проблему .

Ответы [ 4 ]

3 голосов
/ 26 января 2011

Чем больше я думаю об этом, тем больше я убежден, что правильный ответ - просто клонировать все и обновить тег, что можно сделать за один шаг:

hg clone http://host/path#tagname

Он получает все, а затем hg update с тэгом, который устанавливает вашу рабочую директорию в правильную ревизию.Учитывая дельта-сжатие, оно не обязательно намного больше, и если это так, вы можете автоматизировать клонирование большей части его из предыдущего локального клона.

3 голосов
/ 22 сентября 2010

Вам нужен гигантский хак с bash и встроенным скриптом Perl?Ну, вот оно ...

#!/bin/bash
if [[ "$1" == "" || "$2" == "" || "$3" == "" ]]; then
  echo 'hgclonetag <src> <tgt> <tag>'
  exit 1;
fi

REV=`hg log -R $1 --rev $3: --limit=2 | perl -F: -lane 'if (/:([\dA-Fa-f]+)$/) {print $F[2] if defined($flag);$flag=1;}'`
hg clone --rev $REV $1 $2

Это вызывает команду hg log для извлечения номера ревизии после первой ревизии, связанной с тегом, и затем клонирования к этой ревизии.

В настоящее время это не работает на удаленных репо: -R К сожалению, коммутатор работает только на локальных репо.

1 голос
/ 22 сентября 2010

Есть крючок постклона.Она называется post-clone (страница руководства hgrc показывает, что существуют post-ANYCOMMAND и pre-ANYCOMMAND), хотя, как вы указали, вы также можете использовать *changegroup или update перехватчики, так как клон использует обе эти функции (если вы не подавляетеобновите с -U).

Как насчет простого добавления --localtag, чтобы у вас было имя, но не дополнительная ревизия, если она нужна только для справки.Нечто подобное

hg clone -r tagname URL
hg tag --local tagname

, которое вы могли бы легко встроить в псевдоним оболочки.

Кроме этого, не обязательно гарантированно будет способ иметь ревизию X и ревизию, где ревизия X помеченабез других ревизий, которые вам не нужны, так как тег мог быть применен после выполнения другой работы.Конечно, вы всегда можете обновить до 'X' и иметь последующие наборы изменений в вашем рабочем каталоге, но они все равно будут в вашем репо.

Честно говоря, как только я выяснил, что имя тега не 'Прошло много времени, когда вы клонировали тег, что, как я признаю, поначалу приводило меня в замешательство, я не нашел необходимости брать с собой набор изменений с тегом в нем.

0 голосов
/ 26 января 2011

Да, это может быть сделано с помощью пост-клонирования / вытягивания, но есть несколько мошенников.

Во-первых, это работает только для локального репо, поскольку вы не можете получить список тегов вудаленное репо.

Во-вторых, работа с аргументами и опциями clone / pull не является тривиальной.(Для клона мне нужно получить целевой репо, -r, -u, -U. Для пул мне нужны -r и -u.) Я пытался использовать fancyopts, но он не может справиться с глобальнымиварианты, которые обрабатываются в рассылке.Мне удалось взломать диспетчеризацию, чтобы дать мне только аргументы и опции команды, но она выглядит и выглядит ужасно.

Использование оболочки команд избавит от второй проблемы.

Надеюсь, однажды hgдобавит опцию клонировать и потянуть, чтобы сделать это чисто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...