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

如何判断Git仓库指定目录是否存在未推送的已提交变更?

如何判断Git仓库指定目录是否存在未推送的已提交变更?

我刚好在维护双语言混合仓库时遇到过完全一样的需求——只在js目录有未推送的已提交变更时,才触发代码检查和测试,避免浪费不必要的资源。下面分享几种实用的实现方式:

核心思路

本质是对比本地当前分支和远程master分支的提交差异,只筛选涉及目标目录的提交。如果存在这类提交,就执行后续的检查流程。

方法1:用git log直接验证并封装脚本

这是最直观的方式,通过git log列出本地比远程master多出来的、且涉及目标目录的提交:

# 先拉取远程master的最新状态,避免本地缓存过时
git fetch origin master

# 检查指定目录是否有未推送的已提交变更
if [ -n "$(git log origin/master..HEAD -- js/)" ]; then
  echo "检测到js目录存在未推送的已提交变更,开始执行代码检查和测试..."
  npm run lint && npm run test
else
  echo "js目录无未推送变更,跳过检查流程"
fi

参数说明:

  • origin/master..HEAD:只展示本地HEAD比远程origin/master新增的提交
  • -- js/:仅过滤涉及js/目录的提交
  • -n:判断命令输出是否非空(有输出则说明存在目标提交)

方法2:用git rev-list统计变更数量(更适合脚本判断)

如果想更严谨地用数值判断,可借助git rev-list统计符合条件的提交数量:

git fetch origin master

# 统计js目录中未推送到远程master的提交数量
CHANGE_COUNT=$(git rev-list --count origin/master..HEAD -- js/)

if [ "$CHANGE_COUNT" -gt 0 ]; then
  echo "共检测到$CHANGE_COUNT处js目录的未推送变更,启动检查..."
  npm run lint && npm run test
else
  echo "js目录无未推送变更"
fi

这种方式在脚本中更易做逻辑判断,避免因提交信息格式问题导致误判。

进阶:集成到Git预推送钩子

如果想让这个判断在每次推送前自动执行,可以把脚本放到Git的pre-push钩子中:

  1. 在仓库根目录创建.git/hooks/pre-push文件
  2. 将上述脚本内容粘贴进去
  3. 赋予执行权限:chmod +x .git/hooks/pre-push

这样每次执行git push时,Git会自动先检查js目录是否有未推送变更,再决定是否执行检查和测试。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:17:50