我正在使用 git 编写一些 LaTeX 包。为了能够使用 LaTeX 发布功能,每个包中需要包含以下格式的字符串:
\ProvidesPackage{MyPackageName}[yyyy/mm/dd VersionNumber SomeText]
我经常忘记在将文件上传到 CTAN 之前更新日期和版本号,想知道是否可以使用 git 来自动执行此操作。
我正在寻找一种方法来:
每次提交时自动将当前日期插入到源代码中,仅针对本次提交中更改的文件
当我标记版本时自动将当前日期和版本号插入到所有文件中(标签名称与版本号相同)
答案1
要自动执行操作git
,请使用钩子
你想对每个 git 提交做什么\thing{}
?这就是钩用于。例如,以下post-commit
钩子:
整个提交过程完成后,post-commit 钩子会运行。它不接受任何参数,但您可以通过运行 轻松获取最后一次提交
git log -1 HEAD
。通常,此脚本用于通知或类似用途。
来自 GIT SCM 网站/手册
添加日期git commit
这是最直接的部分。你可以使用这个钩子很简单地实现两个目标的第一部分:
- 用于
git diff-tree --no-commit-id --name-only -r HEAD
获取当前修订版本中更改的文件(请参阅这个解释) - 使用您选择的语言迭代这些文件,并使用您选择的工具插入日期,例如使用
sed
或awk
如果你在本地执行此操作,它将在你的工作副本上留下已更改的未暂存文件;即将git status
显示已更改的文件。您可能希望通过使用下面的附加 repo 来避免这种情况。
添加每个版本git tag
这有点棘手。
git tag
您可以使用中间 git 存储库(本地或远程)来解决不触发任何钩子的问题,git push
每次标记时都转到该存储库。然后,您可以post-update
在该服务器上使用钩子根据最新标记进行重写。
例如:
- 获取最新的标签/版本名称:
git describe --tags $(git rev-list --tags --max-count=1)
sed
使用(或awk
您选择的任何工具)格式化文件- 从该目录上传到 CTAN
我不能用另一个钩子来做这个吗?
它是可以使用 来检测 ref 是否有标签git describe
,例如:
# In a working git repo
$ git tag -a "test1" -m "test tag"
$ git describe --exact-match HEAD
test1
$ git describe --exact-match HEAD^1
fatal: no tag exactly matches 'f8a1d888151809ccfbb3460bbcf310541967e292'
128
但是,使用git tag
不会触发commit
钩子。