如何筛选近2个月未合并至main的Git分支并保留排序?
Git分支筛选与排序技巧
你已经知道用以下命令按提交日期排序并格式化输出远程分支:
git for-each-ref --sort='-committerdate:iso8601' --format='%(committerdate:relative)|%(refname:short)|%(committername)' refs/remotes/ | column -s '|' -t
现在需要实现两个核心需求:
- 过滤掉已合并到
main的分支 - 仅保留近2个月内有更新的分支(可选:只要
authordate/committerdate/creatordate/taggerdate任意一个日期符合条件就保留)
同时希望保留按日期排序的能力。
一、过滤已合并到main的分支
直接用--no-merged=main参数即可,整合到原有命令里:
git for-each-ref --no-merged=main --sort='-committerdate:iso8601' --format='%(committerdate:relative)|%(refname:short)|%(committername)' refs/remotes/ | column -s '|' -t
该命令仅显示未合并到main的远程分支,同时保持原有的排序和格式输出。
二、按日期筛选(仅保留近2个月的分支)
借助Git的%(if)条件判断结合UNIX时间戳实现日期筛选:
- 先计算近2个月的时间戳(以秒为单位):
two_months_ago=$(date -d "-2 months" +%s)
- 结合条件判断筛选符合要求的分支:
git for-each-ref --no-merged=main --sort='-committerdate:iso8601' --format="%(if:gte=$two_months_ago)%(committerdate:unix)%(then)%(committerdate:relative)|%(refname:short)|%(committername)%(end)" refs/remotes/ | grep -v '^$' | column -s '|' -t
%(if:gte=$two_months_ago)%(committerdate:unix):判断分支提交日期的时间戳是否大于等于2个月前的时间戳%(then)...%(end):符合条件时输出指定格式内容,不符合则输出空行grep -v '^$':过滤掉空行,仅保留有效分支内容
三、多日期字段判断(任意一个日期近2个月即保留)
如果需要只要authordate/committerdate/creatordate/taggerdate中任意一个日期在近2个月内就保留分支,可使用多条件逻辑或(||):
git for-each-ref --no-merged=main --sort='-committerdate:iso8601' --format="%(if:or,gte=$two_months_ago:%(authordate:unix),gte=$two_months_ago:%(committerdate:unix),gte=$two_months_ago:%(creatordate:unix),gte=$two_months_ago:%(taggerdate:unix))%(then)%(committerdate:relative)|%(refname:short)|%(committername)%(end)" refs/remotes/ | grep -v '^$' | column -s '|' -t
%(if:or,条件1,条件2,...):只要其中一个条件满足就输出分支内容- 每个条件用于判断对应日期字段的时间戳是否在近2个月范围内
整合优化
可将时间戳计算与命令整合为一行,省去单独赋值步骤:
git for-each-ref --no-merged=main --sort='-committerdate:iso8601' --format="%(if:gte=$(date -d "-2 months" +%s))%(committerdate:unix)%(then)%(committerdate:relative)|%(refname:short)|%(committername)%(end)" refs/remotes/ | grep -v '^$' | column -s '|' -t
内容的提问来源于stack exchange,提问作者iconoclast
相关产品推荐
相关产品推荐

