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

Git pre-push钩子中git diff命令返回空值的原因排查

pre-push钩子中git diff --cached返回空的原因及解决办法

核心原因

git diff --cached是用来对比当前索引(缓存区)和HEAD提交的差异,但pre-push钩子是在你完成git commit之后才触发的——此时你已经把缓存区的内容提交到HEAD了,索引和HEAD完全一致,自然不会有任何差异输出,所以STAGED变量为空。

你之前在git add之后、git commit之前用git diff --cached能看到内容,是因为那时候缓存区还没和HEAD同步,两者有差异。

解决办法

根据你的需求(获取本次要推送的Notebook变更文件),可以替换成以下两种命令:

1. 获取本地分支相对于远程分支的所有变更文件

适合需要推送多个提交的场景:

STAGED=$(git diff --name-only --diff-filter=ACM origin/<你的远程分支名>...HEAD -- notebooks | grep .ipynb)
  • origin/<你的远程分支名>...HEAD:用三点语法对比远程分支和本地HEAD的差异,包含本地所有未推送的提交变更
  • -- notebooks:只限定notebooks目录下的文件,避免额外过滤
  • 保留--diff-filter=ACM(新增、修改、复制的文件)和.ipynb过滤逻辑

2. 获取最后一次提交的变更文件

如果每次只推送单个提交:

STAGED=$(git show --name-only --diff-filter=ACM HEAD -- notebooks | grep .ipynb)
  • git show HEAD:直接查看最后一次提交的变更内容
  • --name-only:只输出文件名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:14:56