我在项目中使用git
和bugs-everywhere
。如果你不知道后者,它是一个简单的基于文本文件的问题跟踪器,即错误只是文件,修改它们是使用命令行工具be
完成的。文件本身存储在git存储库中。 bugs-everywhere
的想法是让问题状态与您提交的代码保持同步。
我想要实现的目标:如果程序员提交更改并引用他刚刚修复的消息中的错误(例如消息类似于fixed #123
),我想标记使用相应的be
命令完成的问题。这显然会更改问题文件。然后我希望这些更改包含在当前提交中。
由于我需要解析提交消息,我不能使用pre-commit
挂钩但需要使用commit-msg
挂钩。但我无法找到任何信息是否可以更改正在提交的内容而只能更改提交的消息。
我的想法是,在commit-msg
钩子中,总是拒绝这样的提交,但也做另一个提交,其中包括问题文件中的相应更改。这留下了一些悬而未决的问题:
或者你能想到一种不同的方法吗?
另一个没有真正解决上述问题的想法是仅使用钩子来检查程序员是否已将问题标记为已完成。我的主要目标是避免忘记将问题标记为已完成。
答案 0 :(得分:1)
正如评论中所讨论的那样,并不是真的建议像这样配置工作流程。
作为替代方案,我选择反过来:当提交包含对问题文件的更改时,请在准备好的提交消息中提及错误。
我使用prepare-commit-msg
钩子实现了这个机制,我将在这里逐步描述:
首先,我根据当前工作目录中的文件列出所有当前修复的错误,并获取其UUID:
fixedbugs="`be list -x --status fixed | sed -n 's# <uuid>\(.*\)</uuid>#\1#p'`"
对于他们每个人,我检查以下两件事:HEAD
中是否已修复错误?问题文件本身是否为提交暂存(允许部分提交)?这可以使用git diff
和HEAD
之间的--staged
来检查;然后根据使用"status": "fixed"
的差异找出行grep
是否已添加。 (注意,这里,十六进制字符串2111156...
是我的bugdir的ID,替换为您自己的ID:
for bug in $fixedbugs; do
if git diff HEAD --staged .be/211156fd-fa49-4e87-878c-7642f7163a4b/bugs/$bug/values | grep '^\+ "status": "fixed",.\?$' > /dev/null; then
# (do something with $bug, e.g. `be show $bug...`)
fi
done
对于每个此类问题“现在要提交修复”(在上面的if
内),我收集一些信息并连接要提交给提交消息的文本行:
# collect information
details="`be show -x 211156fd-fa49-4e87-878c-7642f7163a4b/$bug`"
short="`echo "$details" | sed -n 's#.*<short-name>\(.*\)</short-name>.*#\1#p'`"
shorter="`echo "$short" | sed 's#211/##'`" # remove bugdir
summary="`echo "$details" | sed -n 's#.*<summary>\(.*\)</summary>.*#\1#p'`"
# prepend string in format 'fixed #123: "foo bar is broken"'
prepend="$prepend`echo fixed \#$shorter: \\\"$summary\\\"`\n"
在钩子的末尾,将此字符串添加到准备好的提交消息:
tmpfile="`mktemp`
echo "$prepend" > $tmpfile
cat "$1" >> $tmpfile
mv "$tmpfile" "$1"
完整挂钩文件作为https://gist.github.com/leemes/dd336e5fc88096ad6924
的要点发布如果您有任何改进建议或发现错误,请发表评论。