要自动执行操作git,请使用钩子

要自动执行操作git,请使用钩子

我正在使用 git 编写一些 LaTeX 包。为了能够使用 LaTeX 发布功能,每个包中需要包含以下格式的字符串:

\ProvidesPackage{MyPackageName}[yyyy/mm/dd VersionNumber SomeText]

我经常忘记在将文件上传到 CTAN 之前更新日期和版本号,想知道是否可以使用 git 来自动执行此操作。

我正在寻找一种方法来:

  1. 每次提交时自动将当前日期插入到源代码中,仅针对本次提交中更改的文件

  2. 当我标记版本时自动将当前日期和版本号插入到所有文件中(标签名称与版本号相同)

答案1

要自动执行操作git,请使用钩子

你想对每个 git 提交做什么\thing{}?这就是用于。例如,以下post-commit钩子:

整个提交过程完成后,post-commit 钩子会运行。它不接受任何参数,但您可以通过运行 轻松获取最后一次提交git log -1 HEAD。通常,此脚本用于通知或类似用途。

来自 GIT SCM 网站/手册

添加日期git commit

这是最直接的部分。你可以使用这个钩子很简单地实现两个目标的第一部分:

  1. 用于git diff-tree --no-commit-id --name-only -r HEAD获取当前修订版本中更改的文件(请参阅这个解释
  2. 使用您选择的语言迭代这些文件,并使用您选择的工具插入日期,例如使用sedawk

如果你在本地执行此操作,它将在你的工作副本上留下已更改的未暂存文件;即将git status显示已更改的文件。您可能希望通过使用下面的附加 repo 来避免这种情况。

添加每个版本git tag

这有点棘手。

git tag您可以使用中间 git 存储库(本地或远程)来解决不触发任何钩子的问题,git push每次标记时都转到该存储库。然后,您可以post-update在该服务器上使用钩子根据最新标记进行重写。

例如:

  1. 获取最新的标签/版本名称:git describe --tags $(git rev-list --tags --max-count=1)
  2. sed使用(或awk您选择的任何工具)格式化文件
  3. 从该目录上传到 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钩子。

相关内容