从git log生成包含当前提交消息的changelog

时间:2015-03-10 19:13:06

标签: git

我试图使用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挂钩中有这个但没有访问当前提交消息的权限。这甚至可能吗?

2 个答案:

答案 0 :(得分:0)

看起来你需要使用commit-msg hook和post-commit的组合。在commit-msg钩子中,您编写一个文件,告诉post-commit钩子获取最后一次提交消息并将其添加到日志中。然后,提交后挂钩使用--no-verify标志提交更改日志,以跳过commit-msg挂钩,这样就不会进入无限循环:

提交-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

答案 1 :(得分:0)

这非常简单,但需要复杂/技巧算法。对另一个问题的答案已经很好地解释和指出: https://stackoverflow.com/a/38494680/4934640

拷贝:

是的,您可以使用git hooks在提交时自动添加生成的文件!但它需要一个棘手的脚本。

在这里你可以找到解决的问题。在那里,它在每次提交时更新文件版本,添加新的修改文件并根据需要修改提交。它完全有效: https://github.com/addonszz/Galileo/tree/master/githooks

然后,您只需使用算法替换文件'updateVersion.sh'上的'版本文件替换'算法。也许您需要更改一些内容,例如删除分支限制,因为在那里,只有在“develop”分支上才会运行脚本。

此外,它只会更改指定的文件,如果是暂存的。如果文件没有暂存,那么它将不会执行正常/通常的提交。更确切地说,它打印出每一步都在做什么。

我要解释一下,那个伎俩。这很棘手。在prepare-commit-msg-hook上,它检测是否正在暂存和提交所需的文件。之后,它会创建一个标志文件,并停止prepare-commit-msg-hook。 稍后在post-commit-hook上,它会检查标志文件是否存在。如果是,它会修改提交中的文件。

注意,它会创建一个无限循环,因为它会再次调用prepare-commit-msg-hook(因为我们正在修改)。但由于标志文件,它不会发生。当prepare-commit-msg-hook运行并找到标志文件时,它“知道”发生了什么。然后只是删除标志文件,不要再创建它。这样做,它将阻止post-commit-hook再次修改提交。