写"当前" git标记到文本文件

时间:2015-07-13 14:17:18

标签: git bash versioning

对于我的软件的标记版本,我使用的是git tags。 我希望我的软件显示用户的版本,并执行一些迁移代码,这取决于当前使用的版本。

因此,我尝试使用git-hook pre-commit来生成文件version.txt

#!/bin/sh
# Only show most recent tag without trailing commit information
git describe --tags | awk "{split(\$0,a,\"-\"); print a[1];}" > version.tmp

# Only proceed if version number has actually changed (i.e. a new tag has been created)
if [ ! $(cmp --silent version.tmp version.txt) ] 
then
    echo $?
    echo Updating version.txt.
    mv -f version.tmp version.txt 
    git add version.txt
fi

我输入了命令

$ git add --all
$ git tag -a 1.0
$ git commit

事实证明,标有version.txt的{​​{1}} 包含相应的版本,即1.0,但是之前的版本(1.0而不是。

这个程序有什么问题? 如何用软件保存关于git标签(以及提交)的信息?

2 个答案:

答案 0 :(得分:4)

您必须考虑提交对象以及这些对象发生了什么。

在您的系列语句中,您使用1.0标记当前HEAD,但version.txt包含0.9。标记只是提交对象上的标记,并且由于文件具有" 0.9",这标记了什么。

然后在下次提交时,版本文件会变为1.0,但这是一个新的提交,您不能将1.0的标记更改为指向它。

您似乎尝试使用的标签与其设计方式不同。您可能希望撤消该过程,并让人们更改version.txt文件,并使用post-commit挂钩添加标记。我试过这个,它适用于:

#!/bin/sh

# Only show most recent tag without trailing commit information
git describe --tags | awk "{split(\$0,a,\"-\"); print a[1];}" > version.tmp

# Only proceed if version number has actually changed (i.e. a new tag has been created)
if [ ! $(cmp --silent version.tmp version.txt) ] 
then
    NEWVER=$(cat version.txt)
    echo Adding tag $NEWVER
    git tag -a $NEWVER -m ''
    rm version.tmp
fi

您可能希望查看标记随提交一起移动的备用项,但这也必须在提交后,因为预提交中的任何标记都在当前HEAD上,而不是提交。因此,为什么我必须使用上面的提交后。

我个人试着避免自动标记/版本颠簸,因为有各种各样的结束条件 - 在修改过程中会发生什么?如果他们想要改变怎么办?但是,每个人都有自己的用例。

答案 1 :(得分:0)

我没有标记或提交ID,因为我有Makefile这样的规则:

_timestamp.c:
    @date +'const char monimelt_timestamp[]="%c";' > _timestamp.tmp
    @(echo -n 'const char monimelt_lastgitcommit[]="' ; \
        git log --format=oneline --abbrev=12 --abbrev-commit -q  \
          | head -1 | tr -d '\n\r\f\"' ; \
        echo '";') >> _timestamp.tmp
    @mv _timestamp.tmp _timestamp.c

您可以根据自己的需要进行调整。