如何在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命令的细节。
步骤如下:
- 先安装依赖:
npm install lint-staged --save-dev
- 修改
package.json的配置:
{ "precommit": "lint-staged", "lint-staged": { // 这里可以指定要处理的文件类型,比如只处理.js文件 "*.js": ["node internal/scripts/precommit"] } }
- 在
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
相关产品推荐
相关产品推荐

