如何获取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
相关产品推荐
相关产品推荐

