You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在package.json的precommit钩子中获取已提交文件路径?

解决precommit钩子中获取提交文件路径的方法

嘿,这个问题我刚好有实操经验,给你两个靠谱的解决思路,看哪种更适合你的场景:

方案一:用Git原生命令直接获取(最通用)

在你的precommit.js脚本里,直接通过执行Git命令就能拿到所有要提交的文件路径——因为precommit钩子触发时,Git已经知道你暂存了哪些文件要提交了。

核心命令是:git diff --cached --name-only,它会输出所有暂存区(即将提交)的文件路径列表。

你可以用Node.js的child_process模块来执行这个命令,代码示例如下:

const { execSync } = require('child_process');

try {
  // 执行Git命令,拿到暂存区文件列表
  const rawFiles = execSync('git diff --cached --name-only', { encoding: 'utf-8' });
  // 处理结果:去掉首尾空白、按换行分割、过滤空行
  const commitFiles = rawFiles.trim().split('\n').filter(file => file.length > 0);

  console.log('本次要提交的文件路径:', commitFiles);

  // 接下来你可以针对这些文件做lint检查、格式校验等操作
  // 如果检查不通过,记得用process.exit(1)终止脚本,阻止提交
} catch (err) {
  console.error('获取提交文件列表失败:', err.message);
  process.exit(1); // 钩子执行失败,阻止提交
}

命令参数说明:

  • --cached:指定只查看暂存区的文件变更(也就是你用git add过的文件)
  • --name-only:只输出文件路径,不显示具体的变更内容,方便我们直接处理

方案二:借助lint-staged工具简化(更省心)

如果你觉得自己写Git命令有点麻烦,可以用lint-staged这个专门为Git钩子设计的工具,它会自动把要提交的文件列表传给你的脚本,不用自己处理Git命令的细节。

步骤如下:

  1. 先安装依赖:
npm install lint-staged --save-dev
  1. 修改package.json的配置:
{
  "precommit": "lint-staged",
  "lint-staged": {
    // 这里可以指定要处理的文件类型,比如只处理.js文件
    "*.js": ["node internal/scripts/precommit"]
  }
}
  1. 在precommit.js里直接通过process.argv拿到文件列表:
// precommit.js
// process.argv.slice(2)就是lint-staged传给你的要提交的文件路径数组
const commitFiles = process.argv.slice(2);

console.log('本次要提交的文件:', commitFiles);

// 后续的lint等逻辑直接用这个数组就行

这个方案的好处是不用自己处理Git命令的细节,lint-staged已经帮你封装好了,还支持按文件类型过滤,非常实用。


内容的提问来源于stack exchange,提问作者SmallTown NE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:32:46