我有时会使用包含许多分支的源代码存储库,其中大多数是旧的并且通常不再相关。
在这些情况下,完整的分支列表git branch
并不是很有帮助。有没有办法只列出“活动”分支?例如,只有在过去n天内收到提交的分支?理想情况下,该列表将包括每个分支的最后提交日期,并指示该分支是否已经完全合并。
PS:我意识到这也可以通过删除“旧”分支来解决(如如何处理实验性非合并 git 分支?),但这在给定项目中可能并不总是可行或被接受。
我有时会使用包含许多分支的源代码存储库,其中大多数是旧的并且通常不再相关。
在这些情况下,完整的分支列表git branch
并不是很有帮助。有没有办法只列出“活动”分支?例如,只有在过去n天内收到提交的分支?理想情况下,该列表将包括每个分支的最后提交日期,并指示该分支是否已经完全合并。
PS:我意识到这也可以通过删除“旧”分支来解决(如如何处理实验性非合并 git 分支?),但这在给定项目中可能并不总是可行或被接受。
您可以使用git-for-each-ref获取所有本地和跟踪分支的列表,按最后一次提交的提交者日期降序排序,如下所示:
git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes
这输出例如:
2012-06-23 refs/heads/master
2012-06-21 refs/remotes/origin/HEAD
2012-06-21 refs/remotes/origin/master
您可以添加--count=m
最多获得m个分支,您可以--sort=-authordate
不使用提交者日期,当然也可以使用不同的格式。for-each-ref
它本身不会按日期限制结果,这必须单独编写脚本,但至少您手头有来自提交对象的日期。
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;
这个 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-
编辑:我想的越多,我就越担心这可能不可靠,因为ls-remote
总是连接到远程端而log
不是。它可能需要fetch
在每次运行此命令之前执行。