将“当前”git 标签写入文本文件

Her*_*ner 4 versioning git bash

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

因此,我尝试使用 git-hookpre-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
Run Code Online (Sandbox Code Playgroud)

我输入了命令

$ git add --all
$ git tag -a 1.0
$ git commit
Run Code Online (Sandbox Code Playgroud)

原来,version.txt标记1.0不会包含相应的版本,那就是1.0,但以前的版本(0.9)来代替。

这个程序有什么问题?还有什么可能在软件中保留有关 git 标签(以及提交)的信息?

Mar*_*her 5

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

在您的一系列语句中,您使用 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
Run Code Online (Sandbox Code Playgroud)

您可能想要查看标签随提交移动的替代方法,但这也必须在提交后,因为预提交中的任何标记都在当前 HEAD 上,而不是即将提交的那个。因此,为什么我必须使用上面的 post-commit。

我个人尝试避免自动标记/版本碰撞,因为存在各种最终条件 - 修改期间会发生什么?如果他们想变基怎么办?但是,每个人都有自己的用例。