【问题标题】:generate changelog from git log including the current commit message从 git log 生成更新日志,包括当前提交消息
【发布时间】:2015-05-12 09:22:21
【问题描述】:

我正在尝试使用 git 挂钩从提交中自动生成变更日志。我在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 钩子中拥有这个,但无法访问当前的提交消息。这甚至可能吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    看来您需要结合使用 commit-msg hook 和 post-commit。在 commit-msg 挂钩中,您编写一个文件,告诉 post-commit 挂钩获取最后一条提交消息并将其添加到日志中。 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

    【讨论】:

    • 是的,这就是我在上面所做的,下面一行:MSG=$(cat $1)
    【解决方案2】:

    这很容易,但需要复杂/技巧的算法。关于另一个问题的答案已经很好地解释并指出了: https://stackoverflow.com/a/38494680/4934640

    复制:

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

    在这里您可以找到已解决的问题。在那里,它会在每次提交时更新文件版本,添加新的修改文件并根据需要修改提交。它完全正常工作: 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 再次修改提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2012-05-31
      • 2019-12-28
      • 1970-01-01
      • 2019-12-11
      • 2016-04-26
      • 1970-01-01
      相关资源
      最近更新 更多