如何在git中仅列出活动/最近更改的分支?

sle*_*ske 25 git branch git-branch

我有时使用包含许多分支的源代码存储库,其中大多数分支都是旧的,通常不再相关.

在这些情况下,完整的分支列表git branch不是很有帮助.有没有办法只列出"活跃"分支?例如,只有在过去n天内收到提交的分支?理想情况下,列表将包括每个分支的最后提交日期,并指示分支是否已完全合并.

PS:我意识到这也可以通过删除"旧"分支来解决(例如,如何处理实验性非合并git分支?),但这可能并不总是实际的或在给定项目上被接受.

Mic*_*ski 32

您可以使用git-for-each-ref获取所有本地和跟踪分支的列表,这些分支按上次提交的提交者日期的降序排序,如下所示:

git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes
Run Code Online (Sandbox Code Playgroud)

这输出例如:

2012-06-23 refs/heads/master
2012-06-21 refs/remotes/origin/HEAD
2012-06-21 refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

你可以添加--count=m到最多m个分支,你可以--sort=-authordate代替使用提交者日期,你当然可以使用不同的格式.for-each-ref本身并没有按日期限制结果,这必须单独编写脚本,但至少你手头有提交对象的日期.

  • 不要忘记先运行`git remote prune origin`,否则你可能会得到一个旧列表,包括远程站点上不再存在的东西 (7认同)

jkr*_*cma 7

ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done;
Run Code Online (Sandbox Code Playgroud)

此oneliner打印所有本地分支,按时间从最新到最旧排序.每个分支最后一次提交人类可读日期字符串.你可以把它添加到你的.gitconfig.

对于远程分支我想出了这个令人毛骨悚然的解决方案

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $( echo $b | cut -d' ' -f1 ) --; done | sort -rn -k1,10 | cut -c11-
Run Code Online (Sandbox Code Playgroud)

编辑:我认为越多,我担心这可能是不可靠的,因为ls-remote总是连接到远程端而log不是.fetch在每次运行此命令之前可能需要执行此操作.