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 标签(以及提交)的信息?
您必须考虑提交对象以及这些对象发生了什么。
在您的一系列语句中,您使用 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。
我个人尝试避免自动标记/版本碰撞,因为存在各种最终条件 - 修改期间会发生什么?如果他们想变基怎么办?但是,每个人都有自己的用例。