将 "current" git 标签写入文本文件
Write "current" git tag to text file
对于我的软件的标记版本,我使用 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
原来用 1.0
标记的 version.txt
不 包含相应的版本,即 1.0
,但之前的版本( 0.9
) 相反。
这个程序有什么问题?
还有什么可能用软件保存有关 git 标记(以及提交)的信息?
我没有写标签或提交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
您可以根据自己的需要进行调整。
您必须考虑提交对象以及这些对象发生了什么。
在您的一系列语句中,您将当前 HEAD 标记为 1.0,但 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
您可能想要查看标记随提交移动的替代方案,但这也必须在 post-提交中,因为预提交中的任何标记都在当前 HEAD 上,而不是即将提交的那个。因此,为什么我必须使用上面的 post-commit。
我个人尽量避免自动标记/版本冲突,因为存在各种结束条件 - 修改期间会发生什么?如果他们想变基怎么办?但是,每个人都有自己的用例。
对于我的软件的标记版本,我使用 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
原来用 1.0
标记的 version.txt
不 包含相应的版本,即 1.0
,但之前的版本( 0.9
) 相反。
这个程序有什么问题? 还有什么可能用软件保存有关 git 标记(以及提交)的信息?
我没有写标签或提交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
您可以根据自己的需要进行调整。
您必须考虑提交对象以及这些对象发生了什么。
在您的一系列语句中,您将当前 HEAD 标记为 1.0,但 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
您可能想要查看标记随提交移动的替代方案,但这也必须在 post-提交中,因为预提交中的任何标记都在当前 HEAD 上,而不是即将提交的那个。因此,为什么我必须使用上面的 post-commit。
我个人尽量避免自动标记/版本冲突,因为存在各种结束条件 - 修改期间会发生什么?如果他们想变基怎么办?但是,每个人都有自己的用例。