使用更新挂钩
您了解 Hooks - 请阅读文档 http://www.kernel.org/pub/software/scm/git/docs/githooks.html#cruft-to-get-past-stackoverflow-6-character-minimum-edit关于他们!您可能需要的钩子是 update,每个引用运行一次。 (预接收钩子在整个推送过程中运行一次)SO 上已经有大量关于这些钩子的问题和答案;根据您想要执行的操作,如果需要,您可能可以找到有关如何编写挂钩的指导。
为了强调这确实是可能的,引用文档中的一段话:
通过确保对象名称是一个提交对象,该对象是旧对象名称命名的提交对象的后代,可以使用此挂钩来防止对某些引用进行强制更新。也就是说,强制执行“仅快进”策略。
它还可用于记录旧的..新的状态。
以及具体情况:
该钩子为每个要更新的引用执行一次,并采用三个参数:
- 正在更新的引用的名称,
- 存储在 ref 中的旧对象名称,
- 以及要存储在 ref 中的新对象名。
因此,举例来说,如果您想确保所有提交主题都不超过 80 个字符,则一个非常基本的实现将是:
#!/bin/bash
long_subject=$(git log --pretty=%s $2..$3 | egrep -m 1 '.{81}')
if [ -n "$long_subject" ]; then
echo "error: commit subject over 80 characters:"
echo " $long_subject"
exit 1
fi
当然,这只是一个玩具示例;在一般情况下,您将使用包含完整提交消息的日志输出,将其按提交拆分,并在每个单独的提交消息上调用验证代码。
为什么需要更新挂钩
这已在评论中讨论/澄清;这是一个总结。
更新挂钩每个引用运行一次。 ref 是指向对象的指针;在这种情况下,我们讨论的是分支和标签,通常只是分支(人们不经常推送标签,因为它们通常只是用于标记版本)。
现在,如果用户将更新推送到两个分支(主分支和实验分支):
o - o - o (origin/master) - o - X - o - o (master)
\
o - o (origin/experimental) - o - o (experimental)
假设 X 是“坏”提交,即会使 commit-msg 挂钩失败的提交。显然我们不想接受掌握的推动。因此,更新挂钩拒绝了这一点。但是实验性的提交没有任何问题!更新挂钩接受该挂钩。因此,origin/master 保持不变,但 origin/experimental 会更新:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o - o - o (origin/experimental, experimental)
预接收挂钩仅在开始更新引用之前(第一次运行更新挂钩之前)运行一次。如果你使用它,你将不得不导致整个推送失败,也就是说,因为 master 上有一个错误的提交消息,你以某种方式不再相信实验上的提交是好的,即使它们的消息很好!