我正在尝试使用 git hooks 从提交自动生成变更日志。我把这个挂在
commit-msg
钩子上
#!/bin/sh
git log --oneline > ./CHANGELOG.txt
cat ./CHANGELOG.txt | while read line; do echo "* $line"; done > ./CHANGELOG.md
MSG=$(cat $1)
sed -i "1i* [CURRENT] $MSG" ./CHANGELOG.md
sed -i '1i# CHANGELOG\n' ./CHANGELOG.md
git add ./CHANGELOG.md
rm -rf ./CHANGELOG.txt
问题是更改没有包含在当前提交中。提交后,我的工作树立即变脏,因为 CHANGELOG.md 文件更改未包含在上次提交中。
我最初将其放在
pre-commit
挂钩中,但无法访问当前提交消息。这可能吗?
看起来您需要结合使用 commit-msg 钩子和 post-commit。在 commit-msg 挂钩中,您编写一个文件,告诉 post-commit 挂钩获取最后的提交消息并将其添加到日志中。然后,提交后挂钩会使用
--no-verify
标志提交更改日志,以跳过 commit-msg 挂钩,这样您就不会陷入无限循环:
提交消息
touch .commit
提交后
#!/bin/sh
if [ -a .commit ]
then
rm .commit
git log -1 HEAD > tmpfile && cat COMMIT.md >> tmpfile && mv tmpfile COMMIT.md
git add COMMIT.md
git commit --amend -C HEAD --no-verify
fi
exit
我不确定这在无头状态下如何工作,但它应该有帮助。这个问题包含您正在寻找的大部分内容:https://stackoverflow.com/a/12802592/1861459
这非常简单,但需要复杂/巧妙的算法。在另一个问题的答案中已经得到了很好的解释和指出: https://stackoverflow.com/a/38494680/4934640
复制:
是的,您可以使用 git hooks 在提交上自动添加生成的文件!但这需要一个棘手的脚本。
到这里你就可以发现问题已经解决了。在那里,它会在每次提交时更新文件版本,添加新的修改文件并根据需要修改提交。它正在全面工作: https://github.com/addonszz/Galileo/tree/master/githooks
然后您只需用您的算法替换文件“updateVersion.sh”上的“版本文件替换”算法即可。也许您需要更改一些内容,例如删除分支限制,因为在那里,脚本仅在您位于“开发”分支时运行。
此外,它只会更改指定的文件(如果已暂存)。如果文件没有暂存,那么它除了正常/通常的提交之外什么也不做。更准确地说,它打印出每一步正在做什么。
我要解释一下这个技巧。这是相当棘手的。在prepare-commit-msg-hook上,它检测所需的文件是否正在暂存和提交。之后,它创建一个标志文件,并停止prepare-commit-msg-hook。 稍后在 post-commit-hook 中,它会检查标志文件是否存在。如果是,它会修改提交上的文件。
注意,它会创建一个无限循环,因为它会再次调用prepare-commit-msg-hook(正如我们正在修改的那样)。但由于标志文件的原因,这种情况不会发生。当prepare-commit-msg-hook运行并找到标志文件时,它“知道”发生了什么。然后就是删除标志文件,不再创建它。这样做,它将阻止 post-commit-hook 再次修改提交。
这是一个相当老的问题,但为了再次解决它,我刚刚为简单的 CI 管道创建了一个软而小的帮助实用程序
mkchangelog,
。它是用纯 Bash 编写的,因此没有额外的依赖项。当然,这些来源是开放的,并获得麻省理工学院的许可。