我想得到一个Git存储库中所有分支的列表,顶部有“最新鲜”的分支,其中“最新鲜”的分支是最近提交的分支(因此,更可能是一个分支)我想要注意) .
有没有办法可以使用Git(a)通过最新提交对分支列表进行排序,或者(b)以某种机器可读格式获取分支列表以及每个分支的最后提交日期?
最糟糕的情况是,我总是可以运行 git branch
获取所有分支的列表,解析其输出,然后为每个分支 git log -n 1 branchname --format=format:%ci
,以获取每个分支的提交日期 . 但这将在Windows机器上运行,其中启动一个新进程相对昂贵,因此如果有很多分支,每个分支启动Git可执行文件可能会变慢 . 有没有办法用一个命令完成所有这些?
24 回答
我能够参考上面的例子来创造最适合我的东西 .
git 2.7(2015年第4季度)将直接引入分支排序
git branch
:请参阅commit aa3bc55,commit aedcb7d,commit 1511b22,commit f65f139,...(2015年9月23日),commit aedcb7d,commit 1511b22,commit ca41799(2015年9月24日)和commit f65f139,...(2015年9月23日)Karthik Nayak (KarthikNayak) .
(由Junio C Hamano合并 - gitster - 在提交7f11b48,2015年10月15日)
特别是commit aedcb7d:
制作'
branch.c
' use 'ref-filter
' APIs for iterating through refs sorting. This removes most of the code used in 'branch.c
' replacing it with calls to the 'ref-filter
'图书馆 .它adds the option --sort=<key>:
这里:
或者(见下面的Git 2.19)
另见commit 9e46833(2015年10月30日)Karthik Nayak (KarthikNayak) .
帮助:Junio C Hamano (gitster) .
(由Junio C Hamano合并 - gitster - in commit 415095f,2015年11月3日)
使用Git 2.19,可以默认设置排序顺序 .
git branch
支持配置branch.sort
,如git tag
,已经有一个配置tag.sort
.见commit 560ae1c(2018年8月16日)Samuel Maftoul (``) .
(由Junio C Hamano合并 - gitster - 在提交d89db6f,2018年8月27日)
要列出远程分支,请使用
git branch -r --sort=objectsize
.-r
标志使其列出远程分支而不是本地分支 .使用git for-each-ref的 --sort=-committerdate 选项;
也可用since Git 2.7.0表示git branch:
基本用法:
结果:
高级用法:
结果:
git分支名称列表,按最近提交的顺序排序...
扩展Jakub的答案和Joe的提示,以下将删除"refs/heads/",因此输出仅显示分支名称:
命令:
结果:
这是最佳代码,它结合了另外两个答案:
这是一个简单的命令,列出了最新提交的所有分支:
要按最近提交的顺序排序,请使用
资料来源:http://git-scm.com/book/en/Git-Branching-Branch-Management
我使用以下别名:
recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"
产生:
编辑:使用'|'分隔,感谢@Björn Lindqvist
更新:在当前分支之前添加*,感谢@elhadi
编辑:修复了当前分支是另一个分支的子字符串的情况
编辑:使用更简单的语法为当前分支,感谢@Joshua Skrzypek
我还需要颜色,标签和远程参考,没有任何重复:
因为引用可能很难,这里是bash的别名:
其他答案似乎不允许传递
-vv
来获得详细输出 .所以这是一个单行,按提交日期排序
git branch -vv
,保留颜色等:如果您还想打印提交日期,则可以使用此版本:
样本输出:
它可能更具可读性,分为多行:
这也适用于
git branch
的其他参数,例如:-vvr
列出远程跟踪分支,或-vva
列出远程跟踪和本地分支 .我喜欢使用相对日期并缩短分支名称,如下所示:
哪个给你输出:
我建议制作一个bash文件,用于添加所有您喜欢的别名,然后将脚本分享给您的团队 . 这是一个添加这个的例子:
然后你可以这样做以获得一个格式良好和排序的本地分支列表:
更新:如果您想要着色,请执行此操作:
添加一些颜色(因为
pretty-format
不可用)我有同样的问题,所以我写了一个名为Twig的Ruby gem . 它按时间顺序列出分支(最新的第一个),并且还可以让您设置最大年龄,以便您不列出所有分支(如果您有很多分支) . 例如:
它还允许您存储每个分支的自定义属性,例如,故障单ID,状态,待办事项,并根据这些属性过滤分支列表 . 更多信息:http://rondevera.github.io/twig/
我想出了以下命令(适用于Git 2.13及更高版本):
如果您没有
column
,可以用最后一行替换输出看起来像
我写了关于各个部分是如何工作的a blog post .
从git 2.19开始,您可以简单地:
你也可以:
因此,无论何时在当前存储库中列出分支,它都将按committerdate排序 .
如果每次列出分支时,都希望它们按comitterdate排序:
免责声明:我是git中这个功能的作者,我在看到这个问题时实现了它 .
仅供参考,如果您想获得最近签出的分支列表(而不是最近提交的分支),您可以使用git的reflog:
另见:How can I get a list of git branches that I've recently checked out?
这是另一个执行所有其他脚本的脚本 . 实际上,它为您的shell提供了一个功能 .
它的贡献在于它从你的git配置中提取了一些颜色(或使用默认值) .
基于ilius'版本,但当前分支以星形和彩色显示,并且仅显示未被描述为“月”或“年”的任何内容:
这是我用来在最近的分支之间切换的一个小脚本:
使用这两个别名
只需在git repo中调用它,它将显示最后N个分支(默认为10个)和每个分支旁边的数字 . 输入分支的编号并检出:
我作为剧本的最佳结果:
这是我正在寻找的变化:
tail -r
反转了列表,因此最近的commiterdate
是最后一个 .迟到了这里的派对 . 接受的CML答案很明显,但如果你想要更漂亮的东西,比如GUI,你的起源===“github” .
您可以在仓库中单击"Branches" . 或者直接点击网址:https://github.com/ORGANIZATION_NAME/REPO_NAME/branches
我将接受的答案中的输出传输到
dialog
,给我一个交互式列表:保存为(例如)
~/bin/git_recent_branches.sh
和chmod +x
它 . 然后git config --global alias.rb '!git_recent_branches.sh'
给我一个新的git rb
命令 .git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
这就是你需要的Git v2.19介绍了
branch.sort
配置选项(参见branch.sort) .所以
git branch
默认按提交日期(desc)排序脚本: