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

如何获取git push将推送的文件列表?无上游分支通用方案

获取待推送文件列表的通用Git方案

方案1:利用pre-push钩子的内置参数(推荐)

pre-push钩子执行时,Git会自动传递推送相关的引用信息到脚本标准输入,格式为每行本地引用 本地SHA1 远程引用 远程SHA1。直接用这些参数对比差异,是最准确且不依赖上游分支的方式。

创建或编辑.git/hooks/pre-push脚本,写入以下内容:

#!/bin/sh
# 读取推送的引用信息
read local_ref local_sha remote_ref remote_sha

# 获取待推送的文件列表(去重)
files=$(git diff --name-only "$remote_sha" "$local_sha" | sort -u)

# 这里加入你的代码检查逻辑,比如ESLint
# if [ -n "$files" ]; then
#   eslint $files
#   # 如果检查失败,阻止推送
#   if [ $? -ne 0 ]; then
#     echo "代码检查不通过,推送已终止"
#     exit 1
#   fi
# fi

exit 0

给脚本添加执行权限:

chmod +x .git/hooks/pre-push

这个方案完全不依赖上游分支配置,不管是第一次推送新分支,还是已有上游的分支,都能精准获取本次要推送的文件。

方案2:通用命令(适用于手动执行或非钩子场景)

如果需要在钩子外手动获取待推送文件,可以用以下组合命令,自动适配有无上游分支的情况:

current_branch=$(git rev-parse --abbrev-ref HEAD)
# 尝试获取上游分支
upstream_branch=$(git rev-parse --abbrev-ref @{upstream} 2>/dev/null)

if [ -n "$upstream_branch" ]; then
  # 有上游分支,对比上游
  git diff "$upstream_branch" --name-only | sort -u
else
  remote="origin"
  remote_branch="$remote/$current_branch"
  # 检查远程是否存在同名分支
  if git show-ref --verify --quiet "refs/remotes/$remote_branch"; then
    git diff "$remote_branch" --name-only | sort -u
  else
    # 远程无对应分支(首次推送),获取本地分支所有未推送到远程的文件
    git log --name-only --pretty=format: "$remote..HEAD" | sort -u
  fi
fi

说明:

  • 当分支有上游时,直接对比本地分支与上游分支的差异;
  • 无上游但远程存在同名分支时,对比本地分支与远程同名分支;
  • 首次推送新分支时,通过git log获取所有未推送到远程的提交涉及的文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:53:15