如何判断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钩子中:
- 在仓库根目录创建
.git/hooks/pre-push文件 - 将上述脚本内容粘贴进去
- 赋予执行权限:
chmod +x .git/hooks/pre-push
这样每次执行git push时,Git会自动先检查js目录是否有未推送变更,再决定是否执行检查和测试。
内容的提问来源于stack exchange,提问作者Ilias Karim
相关产品推荐
相关产品推荐

