对于我的软件的标记版本,我使用的是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标签(以及提交)的信息?
答案 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
您可以根据自己的需要进行调整。