预提交挂钩后的最新提交消息模板

up-to-date commit message template after pre-commit hook

我想设置我的 git 挂钩,这样当我提交一些东西时,如果代码库不是最新的,就会自动生成一个工件,然后与其余部分一起上演和提交手动暂存文件。

我知道这不一定是最佳做法,但我目前仍在试验,我希望有这个选项;另一种选择是,如果工件已过时,则使 pre-commit 挂钩失败,然后手动暂存它,但由于 CI 管道只需要该工件,这可能是一个无用的附加步骤。

我目前正在制作工件并在 pre-commit 挂钩中暂存它(通过 git add artifact)。有效。

问题是提交消息模板(当我在编辑器中编辑新提交消息时弹出的模板)没有反映更新的索引(在 pre-commit 挂钩通过暂存修改它之后新神器)。

知道如何使该消息保持最新吗?

我正在调查 prepare-commit-msg:我可以在那里操纵过时的消息。有没有输出文件全部内容的命令COMMIT_EDITMSG?也许我可以以某种方式重新运行它并替换文件内容...

编辑: 我正在查看源代码。消息似乎是在代码中编写的,而不是通过命令(在 prepare_to_commit function, half hard-coded half output of status_printf and status_printf_ln). The pre-commit is called before the message is composed 内),而是来自相同的函数,这可以解释为什么消息已过时(我的 git add 命令没有修改功能状态)。这可不是什么好兆头。

由于生成初始提交消息的方式,似乎没有简单的方法直接利用该代码(请参阅我的编辑)。

需要手动重写,但事实证明,实现起来并不难。这是一个 prepare-commit-msg 钩子,可以满足我的需求:

#!/bin/sh

# The file containing the default commit message
COMMIT_MSG_FILE=

# Clear the old git status from the default message: since it's 
# the last default fragment we can clear till the end of the file
sed -i '/# On branch/,$d' $COMMIT_MSG_FILE

# Recompute the git status, without newcomers hints and comment it out
status=$(git -c "advice.statusHints=false" status | awk '{print "# " [=10=]}')

# Write the new status to the commit message
cat << EOF >> $COMMIT_MSG_FILE
$status
EOF

但是!不要这样做!

例如,不要暂存来自 pre-commit 挂钩的文件(消息重写本身应该没问题)。由于 ,某些提交命令(如 git commit --only)可能会导致混乱状态。