我有一个开源静态JavaScript + HTML应用程序,它现在部署在三个不同的地方,一个在我的本地机器上,一个在内部服务器上,一个在稳定的外部服务器上.
我希望能够立即告诉哪个版本部署在哪个地方,并且我希望bug报告者可以轻松访问他们报告错误的版本.
理想情况下,作为提交过程的一部分,我希望使用提交的哈希值来编写文件.当然,根据我对Git的了解,这是不可能的,因为将计算的哈希作为提交中文件的一部分包含在内会改变该提交的计算哈希值.
另一方面,我可以将构建它作为构建过程的一部分.我目前没有构建过程,如果可能的话,我想避免添加一个步骤.
最干净的方法是什么?
由于Git的本质,这有一些微妙之处.我这样做的方法是复制Git开发人员自己做的事情.首先,你会想要使用注释标签,无论如何这可能是一个好主意.要查看,您可以创建一个这样的新标记:
$ git tag -a -m "Version 0.2" v0.2 HEAD
然后(如Otto的帖子所示),您可以使用git describe
一个有用的"版本"字符串,该字符串将包括自标记以来的提交数和当前提交的sha1的前导数字.以下是我的一个项目的示例:
$ git describe v1.0-3-gee47184
也就是说,这个副本在"v1.0"标签之前是3次提交,而提交sha1以ee47184开头(我不确定为什么它们包括那个领先的'g').
Git开发人员更进一步,如果工作副本被修改(未提交),还包括一个额外的位.这需要更多的步骤,所以它们都被包含在他们命名的脚本中VERSION-GEN
.运行时,它会将版本字符串打印到标准输出,并创建一个VERSION-FILE
文件(如果版本没有更改,脚本会小心不要重新触摸该文件 - 所以它的构建工具友好).然后,您可以VERSION-FILE
在源代码,帮助文件等中包含该文件.
使用我的示例VERSION-GEN
脚本(下面),上面示例的我的版本字符串是:
$ VERSION-GEN version: 1.0-3-gee47
如果我修改任何跟踪文件,它看起来像这样:
$ VERSION-GEN version: 1.0-3-gee47-mod
这是我稍微调整过的版本VERSION-GEN
.请注意,它期望标记版本的标签的格式为v [0-9]*(例如,v1.0或v0.2或v12.3.4或v12.2-4feb2009等)
#!/bin/sh
# Tag revisions like this:
# $ git tag -a -m "Version 0.2" v0.2 HEAD
VF=VERSION-FILE
DEFAULT_VERSION=UKNOWN
LF='
'
# First see if there is a version file (included in release tarballs),
# then try git-describe, then default.
if test -d .git -o -f .git &&
VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
case "$VN" in
*$LF*) (exit 1) ;;
v[0-9]*)
git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD --)" ||
VN="$VN-mod" ;;
esac
then
continue
#VN=$(echo "$VN" | sed -e 's/-/./g');
else
VN="$DEFAULT_VERSION"
fi
VN=$(expr "$VN" : v*'\(.*\)')
# Show the version to the user via stderr
echo >&2 "version: $VN"
# Parse the existing VERSION-FILE
if test -r $VF
then
VC=$(sed -e 's/^version: //' <$VF)
else
VC=unset
fi
# If version has changed, update VERSION-FILE
test "$VN" = "$VC" || {
echo "version: $VN" >$VF
echo >&2 "($VF updated)"
}
将其添加到自动部署系统.
如果您的部署不是自动化的,那么将其自动化并将其添加到那里.然后你删除了一个步骤.
使它更有用"这是从z存储库y时间部署在x日期".提交的哈希对非开发人员来说并不是很重要.