git hook之prepare-commit-msg

本文介绍如何利用git内置的prepare-commit-msg hook自动在commit消息中插入所需的规范信息,简化操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git内置了九个hook,详细请man hooks

其中prepare-commit-msg这个hook是在git commit准备好默认的log信息之后, 在启用editor之前调用的,使用这个信息我们可以对commit信息可以进行编辑,通常的需求是commit的信息需要合乎一定的规范,但是这个规范的动作每次都要自己填写会很麻烦,这就情况下就可以使用这个hook对消息进行编辑。这里假定有这么一个需求,我们将upstream的patch拿到自己维护的版本时需要将upstream的信息附上。通常我们的做法是从upstream拿来patch

alloc@bash-4.3> git format-patch -1 597f22d6aa46105d69648a5c042d1fabe182c6f6


然后将patch打到自己的版本

bash-4.3> git am ~/patch-me/0001-ixgbe-add-support-for-interrupts-from-X550-external-.patch 


然后再修改添加必要的规范信息

bash-4.3> git commit --amend -s

如果patch基本没啥问题的话,每次这样操作一遍也很费时,因此我们要使用hook来自动完成这个任务。下面是prepare-commit-msg的代码片段,主要是完成插入规范信息的动作。

case "$2,$3" in
  merge,)
    /usr/bin/env perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;

# ,|template,)
#   /usr/bin/env perl -i.bak -pe '
#      print "\n" . `git diff --cached --name-status -r`
#        if /^#/ && $first++ == 0' "$1" ;;

   commit,*)
        name=$(cat ~/patch-me/name)
        file=~/patch-me/$name
        commit=$(head -1 $file | cut -d ' ' -f2)
        sed -i "1a\\\ncommit $commit upstream" $1;;
  *) ;;
esac

下面这个脚本是apply patch,然后commit,注意git commit的时候加了个--no-edit的参数,这样就不会再启动editor session了。

#! /bin/bash

filename=$(cat ~/patch-me/name)
file=~/patch-me/$filename

echo $file
[ ! -e $file ] && echo "file no exit" && exit 2

git am $file

if [ $? != 0 ]
then
        echo "failed to apply patch, please apply it manually"
        exit 1
fi

git commit --amend -s --no-edit


### 使用 `git commit` 命令的方式及注意事项 #### 使用方式 `git commit` 是 Git 版本控制系统中的核心提交命令,用于将暂存区(Stage/Index)中的修改、新增或删除的文件永久记录到本地仓库(Repository),生成一个新的提交记录(Commit)[^2]。基本使用方式如下: ```bash git commit -m "提交信息" ``` - `-m` 参数用于指定本次提交的描述信息,建议清晰描述修改内容,以便后续追踪和理解。 提交记录会包含修改的具体内容、作者信息、时间戳以及关联的提交哈希值(用于唯一标识此次变更)。 在提交过程中,`git commit` 会触发以下钩子(hook)脚本的执行: - `pre-commit`:在提交前运行,用于检查提交内容是否符合规范。 - `prepare-commit-msg`:用于准备默认的提交信息。 - `commit-msg`:用于校验提交信息的格式。 - `post-commit`:在提交完成后运行,通常用于通知或清理操作。 有关钩子脚本的详细信息,可参考 `githooks(5)` 文档[^1]。 #### 注意事项 1. **确保文件已添加到暂存区** 在执行 `git commit` 之前,必须确保已经使用 `git add` 命令将需要提交的文件添加到暂存区。未添加的修改不会被提交到仓库中[^4]。 ```bash git add <文件名> ``` 2. **避免使用 `--hard` 参数进行重置** 如果在提交之前执行了 `git reset --hard`,则会直接丢弃未提交的更改,可能导致数据丢失。因此,在使用 `git reset --hard` 之前,应确保已经提交、暂存或保存了重要更改[^3]。 3. **撤销提交** 如果提交后发现错误,可以使用 `git reset` 命令撤销提交。例如,撤销最近一次提交但保留更改内容: ```bash git reset --soft HEAD^ ``` 如果希望同时清除更改内容: ```bash git reset --hard HEAD^ ``` 但需注意,`--hard` 参数会直接丢弃更改,务必谨慎使用[^3]。 4. **编辑提交信息** 如果提交后发现提交信息有误,可以使用以下命令修改最近一次提交的信息: ```bash git commit --amend ``` 此命令会打开默认编辑器,允许修改提交信息。如果希望直接指定新的提交信息: ```bash git commit --amend -m "新的提交信息" ``` 5. **多用户协作时的配置** 在多人协作开发中,应确保已配置正确的用户名和邮箱,以便在提交记录中正确标识提交者身份: ```bash git config --global user.name "你的用户名" git config --global user.email "你的邮箱@example.com" ``` 如果希望为某个特定仓库设置不同的用户名或邮箱,可以在该仓库目录下运行不带 `--global` 参数的命令[^2]。 6. **查看提交历史** 提交完成后,可以使用以下命令查看提交历史记录: ```bash git log ``` 该命令会显示每次提交的哈希值、作者、时间及提交信息,有助于追踪变更历史。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值