你如何在Git项目的文件中包含当前的提交ID?

时间:2009-02-05 01:36:53

标签: git

我有一个开源的静态JavaScript + HTML应用程序,它现在部署在三个不同的地方,一个在我的本地机器上,一个在内部服务器上,一个在稳定的外部服务器上。

我希望能够立即告诉哪个版本部署在哪个地方,并且我希望错误报告者可以轻松访问他们报告错误的版本。

理想情况下,作为提交过程的一部分,我希望使用提交的哈希值来编写文件。当然,根据我对Git的了解,这是不可能的,因为将计算的哈希作为提交中文件的一部分包含在内会改变该提交的计算哈希值。

另一方面,我可以将构建它作为构建过程的一部分。我目前没有构建过程,如果可能的话,我想避免添加一个步骤。

最干净的方法是什么?

2 个答案:

答案 0 :(得分:29)

由于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)"
}

答案 1 :(得分:6)

将其添加到自动部署系统。

如果您的部署未自动化,则将其自动化并将其添加到那里。然后你删除了一个步骤。

使它更有用“这是从z存储库中部署在x日期的时间”。提交的哈希对非开发人员来说并不意味着很多。