目前,我只知道如何在提交后添加标记。这意味着获得仅包含标记的第二个提交。是否可以在提交时添加标记?
答案 0 :(得分:37)
不,因为标记是包含变更集ID和标记名称的存储库根目录的.hgtags
文件中的条目,并且此文件本身受版本控制。在创建变更集之前,不知道变更集ID,因此标记会创建另一个变更集,以检查记录该变更集标记的.hgtags
文件。
答案 1 :(得分:4)
根据mercurial wiki,这是不可能的。就像马克说的那样。 https://www.mercurial-scm.org/wiki/Tag
然而,我只是想知道。为什么mercurial完全无视.hgtags文件?就像它忽略了.hg /文件夹。 因此,每当它生成变更集ID时,mercurial都不会包含.hgtags。
如果.hgtags,.hgignores等位于里面会很棒.hg /
答案 2 :(得分:3)
就我而言,Hg标记系统有点乱,因为创建标记会更改历史记录,即使没有项目文件发生更改也需要合并和提交。标记会很快给历史图带来负担。
我使用的SVN标记是在一个单独的分支上完成的,它具有不改变工作分支历史的优点。此外,标记可以从任何分支完成,因为Hg从所有分支的头部的.hgtags文件中获取标记。
下面的小脚本创建了一个分支“标记”并将标记放入其中。它将当前分支合并到“标记”分支中,因此很容易看到变换集标记已完成(它特别避免了切换分支时的长刷新)。
它可能会有所改进,但它符合我的需要。
我强烈建议在测试此脚本之前复制您的项目,以防它的行为不符合您的预期!
#!/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
答案 3 :(得分:0)
不确定这是否是您要找的,但您可以将标记移动到其他变更集。
hg com -m "moving tag to this changeset"
hg tag 0.1 -f
hg push