在git commit message中强制执行模板结构

5jvtdoz2  于 2023-03-21  发布在  Git
关注(0)|答案(1)|浏览(133)

我有一个模板,有一个样本(例如:工作ID #ADC 0000)

  • <Git_base>/.gitmessage

我已经把它添加到.git/hooks中的prepare-commit-msg消息中。

#!/bin/bash

# Get the default commit message from a file
commit_msg_file="/d/gitTest/.gitmessage"
commit_msg=$(cat "$commit_msg_file")

# Prepend the default commit message to the commit message file
echo -e "$commit_msg\n$(cat "$1")" > "$1"

我看过https://git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy,但不知道如何连接模板和服务器端钩子(我假设客户端不会强制执行它,也不能在克隆仓库时获得它,除非他们设置了hookPath,这也不能强制执行)。

tyg4sfes

tyg4sfes1#

你不能强迫人们在他们自己的仓库中使用一个模板或一组钩子,在很多情况下,你也不想这样做。例如,有人可能想创建一个快速的WIP提交,或者创建squash或fixup提交,以便以后重新定位到他们的分支中,或者任何其他高级开发技术,你也不想阻止这些。
您可以在钩子中使用shell(或Python或Ruby)脚本来验证消息是否符合某种格式标准。如果您要包含票证ID之类的内容,那么最好在trailer中进行验证,trailer是专门为此目的而设计的。
最简单的方法是在你的CI系统中,你可以这样做(假设你使用的是Ticket-ID trailer):

git log -1 --format=%B HEAD | git interpret-trailers --parse | grep -qs Ticket-ID

如果它找到了ticket ID,则退出0,如果没有,则退出非零,这通常会导致分支失败。(注意,它不会查看所有的提交,只查看最新的提交。)如果结构不同,您也可以做不同的事情,比如:

git rev-list --format=%B HEAD | ruby -e '
def verify(text, commit)
  unless text.nil? || text =~ /^Ticket-ID: (\d+)/
    $stderr.puts "#{commit} is malformed"
    exit 1
  end
end
text = nil
commit = nil
while gets
  if $_ =~ /^commit ([0-9a-f]+)/
    verify(text, commit)
    commit = $1
    text = ""
  else
    text += $_
  end
end
verify(text, commit)'

如果你使用的是pre-receive钩子,那么你可以这样做:

#!/bin/sh

set -e

while read old new ref
do
    if echo $new | grep -qs '^0+'
    then
        # deletion, probably do nothing
        :
    elif echo $old | grep -qs '^0+'
    then
        # creation
        git rev-list --format=%B "$new" | my-script "$ref"
    else
        # creation
        git rev-list --format=%B "$old..$new" | my-script "$ref"
    fi
done

其中my-script REF是一个脚本,它解析git rev-list的输出以获取引用REF,并在失败时以非零值退出。

相关问题