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

求助:获取30天内有提交的远程分支并排序失败

解决Git脚本无法筛选30天内有提交的远程分支问题

原脚本的核心问题

  1. 未过滤符号引用:git branch -r会输出origin/HEAD -> origin/main这类指向分支的符号引用,这类引用没有提交记录,会干扰筛选逻辑。
  2. 分支遍历逻辑缺陷:直接通过for branch in $branches遍历,若分支名包含空格(虽然罕见)会被错误拆分,导致脚本出错。
  3. 低效且易出错的时间判断:循环中多次调用git log性能较差,且--since的时间判断可能受本地时区或Git配置影响,出现偏差。

修复后的脚本方案

方案一:修复原脚本逻辑

git fetch --prune  # 先清理已删除的远程分支,避免无效分支干扰

# 过滤掉符号引用,只保留真实远程分支,并存入数组
mapfile -t branches < <(git branch -r | grep -v '\->')

filtered_branches=()
for branch in "${branches[@]}"; do
  # 用git show直接检查分支最后一次提交是否在30天内,更可靠
  if git show -q --since="30 days ago" "$branch" >/dev/null 2>&1; then
    filtered_branches+=("$branch")
  fi
done

# 按最后提交时间从旧到新排序
sorted_branches=()
while read -r timestamp branch; do
  sorted_branches+=("$branch")
done < <(for branch in "${filtered_branches[@]}"; do
  echo "$(git log -1 --format=%ct "$branch") $branch"
done | sort -n)

# 输出结果
printf "%s\n" "${sorted_branches[@]}"

方案二:用git for-each-ref高效实现(推荐)

git for-each-ref可以直接批量处理远程分支,无需循环调用Git命令,性能和准确性更优:

git fetch --prune

# 直接筛选并排序30天内有提交的远程分支,按最后提交时间从旧到新排列
git for-each-ref \
  --sort=authordate \
  --format='%(refname:short)' \
  --since="30 days ago" \
  refs/remotes/

关键优化说明

  • git fetch --prune:清理本地缓存的已在远程删除的分支,避免处理无效分支。
  • grep -v '\->':过滤掉origin/HEAD这类符号引用,只处理真实分支。
  • mapfile -t:将分支列表安全存入数组,避免分支名含特殊字符时的拆分问题。
  • git for-each-ref:批量处理所有远程分支,通过--since直接筛选,--sort=authordate实现按提交时间排序,一步到位,效率远高于循环调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:12:17