求助:获取30天内有提交的远程分支并排序失败
解决Git脚本无法筛选30天内有提交的远程分支问题
原脚本的核心问题
- 未过滤符号引用:
git branch -r会输出origin/HEAD -> origin/main这类指向分支的符号引用,这类引用没有提交记录,会干扰筛选逻辑。 - 分支遍历逻辑缺陷:直接通过
for branch in $branches遍历,若分支名包含空格(虽然罕见)会被错误拆分,导致脚本出错。 - 低效且易出错的时间判断:循环中多次调用
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
相关产品推荐
相关产品推荐

