如何在Git的prepare-commit-msg钩子中获取变更文件列表
prepare-commit-msg钩子获取待提交变更文件说明
结论
可以在prepare-commit-msg钩子的执行阶段获取到所有待提交的变更文件列表。
实现原理
prepare-commit-msg钩子的触发时机在默认提交信息生成后、提交信息编辑器打开前,此时所有待提交的内容已经全部存入暂存区,暂存区和当前HEAD的差值就是你需要的全量变更内容。
获取方法
直接调用git diff --cached --name-only命令即可获取所有待提交的文件路径,该命令会输出所有已加入暂存区的变更文件的相对路径,包含新增、修改、删除、重命名等所有变更类型的文件。
如果需要过滤特定变更类型的文件,可以追加--diff-filter参数,常用示例:
git diff --cached --name-only --diff-filter=A仅获取新增的文件git diff --cached --name-only --diff-filter=M仅获取修改的文件git diff --cached --name-only --diff-filter=D仅获取删除的文件
示例钩子脚本
#!/bin/sh # prepare-commit-msg 钩子核心逻辑示例 COMMIT_MSG_FILE=$1 # 拉取所有待提交变更文件 CHANGED_FILES=$(git diff --cached --name-only) GENERATED_MSG="" # 自定义提交信息生成逻辑,可按自己的路径规则调整 echo "$CHANGED_FILES" | while read -r FILE; do case $FILE in src/*) GENERATED_MSG="${GENERATED_MSG}feat: 调整业务逻辑 $FILE " ;; config/*) GENERATED_MSG="${GENERATED_MSG}config: 修改配置项 $FILE " ;; docs/*) GENERATED_MSG="${GENERATED_MSG}docs: 更新文档内容 $FILE " ;; esac done # 把生成的内容写入提交信息文件 if [ -n "$GENERATED_MSG" ]; then echo "$GENERATED_MSG" > "$COMMIT_MSG_FILE" fi
注意事项
- 脚本编写完成后需要执行
chmod +x .git/hooks/prepare-commit-msg赋予可执行权限才能正常触发 - 该方法对
git commit -m、git commit --amend、合并提交等所有提交场景都生效,无需额外适配
内容的提问来源于stack exchange,提问作者xeruf
相关产品推荐
相关产品推荐

