На данный момент я знаю только, как добавить тег после коммита. Это означает, что получить второй коммит, который просто содержит тег. Можно ли добавить тег при фиксации?
Tortoise HG — добавить тег при фиксации
Ответы (4)
Нет, потому что тег — это запись в файле .hgtags
в корне вашего репозитория, содержащая идентификатор набора изменений и имя тега, а сам этот файл находится под контролем версий. Идентификатор набора изменений неизвестен до тех пор, пока набор изменений не будет создан, поэтому тегирование создает другой набор изменений для проверки в файле .hgtags
, записывающем тег для этого набора изменений.
Согласно меркуриальной вики, это невозможно. Как сказал Марк. https://www.mercurial-scm.org/wiki/Tag
Но тогда мне просто интересно. Почему бы mercurial вообще не игнорировать файл .hgtags? точно так же, как он игнорирует папку .hg/. Таким образом, mercurial не будет включать .hgtags каждый раз, когда генерирует идентификатор набора изменений.
Было бы здорово, если бы .hgtags, .hgignores и т. д. находились внутри .hg/
С моей точки зрения, система тегов Hg немного запутана, потому что создание тега изменяет историю и требует слияния и фиксации, даже если ни один файл проекта не изменился. Теги могут очень быстро перегрузить график истории.
Я использовал теги SVN, которые были сделаны в отдельной ветке, что имеет то преимущество, что не изменяет историю рабочих веток. Более того, тегировать можно из любой ветки, т.к. Hg берет теги из файлов .hgtags на головы всех веток.
Небольшой скрипт ниже создает ветку "tagged" и помещает в нее теги. Он объединяет текущую ветку в ветку «пометки», поэтому легко увидеть, из чего был сделан тег набора изменений (особенно это позволяет избежать длительных обновлений при переключении ветки).
Вероятно, его можно улучшить, но он удовлетворяет мои потребности.
Я настоятельно рекомендую сделать клон вашего проекта, прежде чем тестировать этот скрипт, на случай, если он будет вести себя не так, как вы ожидаете!
#!/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
Не уверен, что это то, что вы ищете, но вы можете переместить тег в другой набор изменений.
hg com -m "moving tag to this changeset"
hg tag 0.1 -f
hg push