你需要一个测试。
git tag
命令不起作用
文件
退出状态。手工测试表明
一个,但您可能不希望依赖此未记录的功能。为了避免依赖退出状态,我们可以检查输出:
tag=$(git describe --tags --abbrev=0)
if [ "x$tag" = x ]; then
# there is no tag
# so here we'll do something different
fi
在现代的贝壳里,你不需要有点傻
"x$tag"
诀窍:
tag=$(git describe --tags --abbrev=0)
if [ "$tag" = "" ]; then ...; fi
要获取可从当前提交访问的根提交的哈希ID,请使用
--max-parents=0
. 理想情况下,只有一个这样的根,但根据存储库历史的形状,有可能有多个,在这种情况下,您必须决定对此要做什么。避免这种可能性的一种方法是,通过只遍历第一个父级,预先确定要查找哪个根。
git log
,这需要添加
--pretty=format
--format
只提取散列ID的指令,通常使用
git rev-list
在这里rev list“管道”命令的一个小麻烦是
必须
提供一个起点,而
吉特日志
HEAD
如果你不提供一个起点。这
是
小调,因为写起来很琐碎
头
first=$(git rev-list --max-parents=0 --first-parent HEAD)
把这些放在一起,我们得到:
tag=$(git describe --tags --abbrev=0)
if [ "$tag" = "" ]; then
tag=$(git rev-list --max-parents=0 --first-parent HEAD)
fi
或者更紧凑的形式:
tag=$(git describe --tags --abbrev=0)
[ "$tag" != "" ] || tag=$(git rev-list --max-parents=0 --first-parent HEAD)
事实上
尝试
git describe
在存储库中
git描述
步骤失败并输出空字符串执行以下操作:
$ git describe --tags --abbrev=0
fatal: No tags can describe '2808ac68000c62c3db379d73e3b7df292e333a57'.
Try --always, or create some tags.
$ echo $?
128
因此,“测试”可以是:
git描述
在这种情况下,我们得到:
tag=$(git describe --tags --abbrev=0 ||
git rev-list --max-parents=0 --first-parent HEAD)
$ tag=$(git describe --tags --abbrev=0 ||
> git rev-list --max-parents=0 --first-parent HEAD)
fatal: No tags can describe '2808ac68000c62c3db379d73e3b7df292e333a57'.
Try --always, or create some tags.
$ echo $tag
460cce09ff42c43a6826af9deaab0f7a8d1f6f44
要使错误消息消失,我们可以将其重定向到
/dev/null
:
tag=$(git describe --tags --abbrev=0 2> /dev/null ||
git rev-list --max-parents=0 --first-parent HEAD)
请注意,如果要隐藏错误消息,则无论选择哪种测试方法,都必须执行此重定向。