Tortoise HG - Добавить тег при коммите - PullRequest
33 голосов
/ 22 декабря 2010

На данный момент я знаю только, как добавить тег после коммита.Это означает, что получить второй коммит, который просто содержит тег.Можно ли добавить тег при коммите?

Ответы [ 4 ]

37 голосов
/ 22 декабря 2010

Нет, поскольку тег - это запись в файле .hgtags в корне вашего хранилища, содержащая идентификатор набора изменений и имя тега, а сам этот файл находится под контролем редакции.Идентификатор набора изменений неизвестен до тех пор, пока набор изменений не будет создан, поэтому тегирование создает другой набор изменений для проверки в файле .hgtags, записывающем тег для этого набора изменений.

4 голосов
/ 17 июля 2012

Согласно Mercurial Wiki, это невозможно. Как сказал Марк. https://www.mercurial -scm.org / вики / Tag

Но тогда мне просто интересно. Почему бы Mercurial вообще не игнорировать файл .hgtags? так же, как он игнорирует папку .hg /. Так что Mercurial не будет включать .hgtags каждый раз, когда генерирует ID набора изменений.

Было бы замечательно, если бы .hgtags, .hgignores и т. Д. Находились внутри .hg /

3 голосов
/ 15 февраля 2012

На мой взгляд, система тегов Hg немного запутана, потому что создание тега меняет историю и требует слияния и фиксации, даже если файл проекта не изменился. Пометка может очень быстро обременять график истории.

Я использовал тегирование SVN, которое было сделано в отдельной ветке, что имеет преимущество в том, что не нужно изменять историю рабочей ветки. Кроме того, тегирование может быть сделано из любой ветви, потому что Hg берет теги из файлов .hgtags на заголовках всех ветвей.

Небольшой скрипт ниже создает ветку "tagging" и помещает в нее теги. Он объединяет текущую ветку с веткой «tagging», поэтому легко увидеть, с какого тега changeset был сделан (особенно это позволяет избежать длительного обновления при переключении ветви).

Вероятно, это можно улучшить, но это соответствует моим потребностям.

Я настоятельно рекомендую сделать клон вашего проекта перед тестированием этого скрипта, если он не работает так, как вы ожидаете!

#!/bin/bash

function echo_red()
{
  echo -n -e "\e[01;31m"
  echo -n "$1"
  echo -e "\e[00m"
}
export -f echo_red

# Display the help and exit
function show_help {
    echo "Usage: $0 [hg_tag_options ...]"
    echo "    tags a version (current if not specified) in the 'tagging' branch."
    echo "    Options are the 'hg tag' ones, plus"
    echo "        -?, -h, --help  Show (this) help"
    exit 1
}

#  Parse the command-line arguments
function parse_args {
    for arg in "${commandline_args[@]}"
    do
        case "$arg" in #(
            '-?' | -h | --help )
                                show_help
                                ;;
        esac
    done
}

commandline_args=("$@") 
if [ "$commandline_args" = "" ]
then
    show_help
fi
parse_args

VER=`hg id | sed 's#\([0-9a-z]*\).*#\1#g'`
BRANCH=`hg branch`

# Check for clean directory
TEST=`hg st -S -q`
if [ "$TEST" != "" ]
then
    echo_red "Directory contains unresolved files !"
    exit 1
fi

hg update --check >/dev/null
if [ $? -ne 0 ]
then
    echo_red "Directory contains unresolved files !"
    exit 1
fi

# Switch to tagging branch
hg update tagging >/dev/null
if [ $? -ne 0 ]
then
    echo "Creating new 'tagging' branch."
    hg update default >/dev/null
    hg branch tagging
fi

# Merge if changes detected
TEST=`hg diff -r $VER -X .hgtags --stat`
if [ "$TEST" != "" ]
then
    #take only the 'tagging' version of hgtags
    cp .hgtags .hgtags.bak
    hg merge -r $VER --tool internal:other >/dev/null
    rm .hgtags
    mv .hgtags.bak .hgtags
    hg commit -m Merged
fi

# Tag and Switch back to original
hg tag -r $VER $@
hg update $BRANCH >/dev/null
hg update $VER >/dev/null

Пример использования:

hg_tag.sh [-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] test_v1_5
0 голосов
/ 23 июля 2012

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

hg com -m "moving tag to this changeset"
hg tag 0.1 -f
hg push
...