我有时使用包含许多分支的源代码存储库,其中大部分都是旧的,通常不再相关。
在这些情况下,git branch
的完整分支列表不是很有帮助。有没有办法只列出“活跃”分支?例如,只有在最后 n 天内收到提交的分支?理想情况下,列表将包括每个分支的最后提交日期,并指示分支是否已完全合并。
P.S .: 我意识到这也可以通过删除“旧”分支来解决(例如在What to do with experimental non-merged git branches?中所讨论的),但这可能并不总是实际的或在给定项目上被接受。
答案 0 :(得分:32)
您可以使用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
本身不会按日期限制结果,这必须单独编写脚本,但至少你手头有提交对象的日期。
答案 1 :(得分: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;
此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
。