如何获取按最近提交排序的 Git 分支列表?
Posted
技术标签:
【中文标题】如何获取按最近提交排序的 Git 分支列表?【英文标题】:How can I get a list of Git branches, ordered by most recent commit? 【发布时间】:2011-07-08 11:34:00 【问题描述】:我想获取 Git 存储库中所有分支的列表,其中“最新”分支位于顶部,其中“最新”分支是最近提交的分支(因此,更有可能成为我想要关注的人)。
有没有一种方法可以让我使用 Git (a) 按最新提交对分支列表进行排序,或者 (b) 以某种机器可读的方式获取分支列表以及每个分支的最后提交日期格式?
最坏的情况,我总是可以运行git branch
来获取所有分支的列表,解析其输出,然后为每个分支运行git log -n 1 branchname --format=format:%ci
,以获取每个分支的提交日期。但这将在 Windows 机器上运行,其中启动一个新进程相对昂贵,因此如果有很多分支,每个分支启动一次 Git 可执行文件可能会变慢。有没有办法用一个命令完成所有这些操作?
【问题讨论】:
***.com/a/2514279/1804124 有更好的答案。 @Spundun,你把我弄丢了。多个命令的组合,包括通过 perl 和 sed 管道传输的内容,如何比使用 Git 已有的命令“更好”? 因为有了这里的答案,我没有得到 repo 中的所有分支。在我的特殊情况下,答案会给我一个分支,而那里的答案给我 20 个左右的分支(使用 -r 选项)。 @Spundun 关于来自 Jakub Narębski 的git for-each-ref
的答案:您可以获得通过refs/remotes/
而不是refs/heads/
的远程分支(或者您可以同时通过两者,空格分隔); refs/tags/
用于标签,或者只是refs/
用于所有三种类型。
开始 git 2.7(2015 年第四季度),不再有 for-each-ref
!你将直接使用git branch --sort=-committerdate
:见my answer below
【参考方案1】:
使用git for-each-ref
的--sort=-committerdate
选项;
since Git 2.7.0 也可用于git branch
:
基本用法:
git for-each-ref --sort=-committerdate refs/heads/
# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate # DESC
git branch --sort=committerdate # ASC
结果:
高级用法:
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))'
结果:
专业用途(Unix):
您可以将以下 sn-p 放入您的~/.gitconfig
。最近的别名接受两个参数:
refbranch
: ahead 和 behind 列是针对哪个分支计算的。默认主
count
:要显示多少最近的分支。默认20
[alias]
# ATTENTION: All aliases prefixed with ! run in /bin/sh make sure you use sh syntax, not bash/zsh or whatever
recentb = "!r() refbranch=$1 count=$2; git for-each-ref --sort=-committerdate refs/heads --format='%(refname:short)|%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=$count:-20 | while read line; do branch=$(echo \"$line\" | awk 'BEGIN FS = \"|\" ; print $1 ' | tr -d '*'); ahead=$(git rev-list --count \"$refbranch:-origin/master..$branch\"); behind=$(git rev-list --count \"$branch..$refbranch:-origin/master\"); colorline=$(echo \"$line\" | sed 's/^[^|]*|//'); echo \"$ahead|$behind|$colorline\" | awk -F'|' -vOFS='|' '$5=substr($5,1,70)1' ; done | ( echo \"ahead|behind||branch|lastcommit|message|author\\n\" && cat) | column -ts'|';; r"
结果:
【讨论】:
完美!我什至可以通过附加--format=%(refname)
将输出限制为仅引用名称。
这对我来说更好:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
@ilius:为什么不使用:shortname
?
@ilius:正如@BeauSmith 所写:git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/
。 git-for-each-ref(1) 手册页说:对于 ref 的明确短名称附加 :short
。
这是一个彩色版本,包括哈希、消息、基于提交日期的升序排序,以及每个分支上最后一次提交的相对年龄。我从上面的你们那里偷走了所有的想法。它在我的 .gitconfig [alias]
部分,我喜欢它。 br = 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))'
【参考方案2】:
Git 分支名称列表,按最近提交排序...
在Jakub’s answer 和Joe’s tip 上展开,以下将去掉“refs/heads/”,因此输出只显示分支名称:
命令:
git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'
结果:
【讨论】:
你也可以使用--format=%(refname:short)
而不是依赖cut
。
有没有办法为 REMOTE 存储库做到这一点?
aah - @jakub.g 已经解释过:您可以获得通过 refs/remotes/ 而不是 refs/heads/ 的远程分支。完美!!
现在您可以使用git branch
执行此操作,因此获取本地、远程或所有分支就像在 git-branch 上一样(即 -r、-a)。 git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
@AllanBowe 以下将输出 repo 中前 5 个活动分支:git branch -va --sort=committerdate | tail -5
。也许这是您所询问和发现的替代方案。【参考方案3】:
这是一个简单的命令,列出所有最新提交的分支:
git branch -v
要按最近的提交排序,请使用
git branch -v --sort=committerdate
来源:http://git-scm.com/book/en/Git-Branching-Branch-Management
【讨论】:
git branch -av
如果您也想查看非本地分支机构。
是否容易让git branch -v
包含列出的每个提交的日期?
这太棒了。我喜欢git branch -va --sort=-committerdate
显示非本地分支,最近更改的分支位于顶部。【参考方案4】:
这是结合其他两个答案的最佳代码:
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
【讨论】:
甚至稍微优化以获得表格输出:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
出于某种原因,我不得不在 Windows 上使用双引号,但除此之外这些都可以正常工作:)
@schoetbi 那个代码看起来和 nikolay 的代码一模一样,你做了什么改变使它成为表格?
@Enrico 和其他可能想知道同一件事的人。尼古拉用 schoetbis 的建议改变了他的答案。通过首先移动总是相同长度的日期,结果看起来更像表格。【参考方案5】:
我使用以下别名:
recent = "!r() count=$1; 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)' --color=always --count=$count:=10 | column -ts'|'; r"
产生:
我们也可以给出自定义计数,例如,
git recent 20
(默认为 10)。
【讨论】:
伟大的别名!如果逗号字符可以出现在您的语言环境中的相对时间戳内,我会建议column -ts'|'
和管道字符。
至少在最新版本的 git 中,您只需在格式字符串的开头添加 '%(HEAD) ...'
即可获得相同的效果,而无需通过 sed
命令进行管道传输
我无法将其用作 git 别名。我不得不使用[alias] recent = !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'|'
我必须添加 --color=always 才能获得颜色。 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)' --color=always|column -ts'|'
@mwfearnley:对我来说,在大括号内放一个分号有助于!r()git for-each-ref ... ;; r
【参考方案6】:
我能够参考前面的示例来创建最适合我的东西。
git for-each-ref --sort=-committerdate refs/heads/ --format='%(authordate:short) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
【讨论】:
这看起来不错,比我在***.com/a/33163401/6309 中建议的直接使用 git 分支更丰富多彩。 +1 这个对我来说是开箱即用的,不像其他一些,所以我投了赞成票。 工作得非常好!谢谢! :-) 同上 - 这个开箱即用,与我刚刚尝试过的其他一些不同。谢谢。 这个干净整洁。有时我会添加远程和作者姓名:git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
【参考方案7】:
我还需要没有任何重复的颜色、标签和远程引用:
for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'
因为引用可能很难,这里是 Bash 的别名:
alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"
【讨论】:
$| head -n20
。如果您使用的是别名,请确保它在 引号内。【参考方案8】:
git 2.7(2015 年第四季度)将直接使用 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
-- 合并于 commit 7f11b48,2015 年 10 月 15 日)
特别是commit aedcb7d:
branch.c
:使用“ref-filter
”API
让“branch.c
”使用“ref-filter
”API 来迭代引用排序。这将删除 'branch.c
' 中使用的大部分代码替换它
调用“ref-filter
”库。
它adds the option --sort=<key>
:
根据给定的键排序。 前缀
-
按值的降序排序。您可以多次使用
--sort=<key>
选项,在这种情况下,最后一个键成为主键。支持的键是same as those in
git for-each-ref
。 排序顺序默认为基于完整引用名(包括refs/...
前缀)的排序。这首先列出了分离的 HEAD(如果存在),然后是本地分支,最后是远程跟踪分支。
这里:
git branch --sort=-committerdate
或者(参见下面的 Git 2.19)
# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch
另请参阅commit 9e46833(2015 年 10 月 30 日)Karthik Nayak (KarthikNayak
)。
帮助者:Junio C Hamano (gitster
)。(由 Junio C Hamano -- gitster
-- 合并于 commit 415095f,2015 年 11 月 3 日)
当按数值排序时(例如
--sort=objectsize
),当两个 refs 保持相同的值时,没有备用比较。正如 Johannes Sixt ($gmane/280117) 所指出的,这可能会导致意外结果(即无法预先确定具有相同值的 ref 的列出顺序)。因此,回退到基于 refname 的字母比较 每当其他标准相同时。
$ git branch --sort=objectsize * (HEAD detached from fromtag) branch-two branch-one master
使用 Git 2.19,可以默认设置排序顺序。git branch
支持配置 branch.sort
,例如 git tag
,它已经有配置 tag.sort
。
请参阅 Samuel Maftoul (``) 的 commit 560ae1c(2018 年 8 月 16 日)。(由 Junio C Hamano -- gitster
-- 合并于 commit d89db6f,2018 年 8 月 27 日)
branch.sort:
此变量控制
git-branch
显示时分支的排序顺序。 如果不提供“--sort=<value>
”选项,则此变量的值将用作默认值。
要列出远程分支,请使用git branch -r --sort=objectsize
。 -r
标志使它列出远程分支而不是本地分支。
在 Git 2.27(2020 年第二季度)中,“git branch
”和其他“for-each-ref
”变体接受多个--sort=<key>
选项(按优先级递增的顺序),但在“--ignore-case
”处理方面存在一些问题, 并使用 refname 打破平局,已修复。
见commit 7c5045f、commit 76f9e56(2020 年 5 月 3 日)Jeff King (peff
)。(由 Junio C Hamano -- gitster
-- 合并到 commit 6de1630,2020 年 5 月 8 日)
ref-filter
: 仅在所有用户排序后应用后备引用名排序签字人:杰夫·金
提交9e468334b4(“
ref-filter
:按字母顺序比较的回退”,2015-10-30,Git v2.7.0-rc0 -- merge 列在batch #10 中)教导 ref-filter 的排序回退到比较引用名。 但它在错误的级别上执行了此操作,覆盖了来自用户的单个“--sort
”键的比较结果,而不是在所有排序键都用完之后。这适用于单个“
--sort
”选项,但不适用于多个选项。 我们将打破第一个键与 refname 的任何联系,并且根本不评估第二个键。为了让事情变得更有趣,我们有时只应用了这个后备! 对于像“
taggeremail
”这样需要字符串比较的字段,我们会真正返回strcmp()
的结果,即使它是0。 但是对于像“taggerdate
”这样的数字“value
”字段,我们确实应用了后备。这就是为什么我们的多重排序测试错过了这一点:它使用taggeremail
作为主要比较。让我们从添加一个更严格的测试开始。我们将有一组提交,表达两个标记电子邮件、日期和参考名称的每个组合。然后我们可以确认我们的排序应用了正确的优先级,我们将同时命中字符串和值比较器。
这确实显示了错误,修复很简单:在所有
ref_sorting
键已用尽之后,将回退移动到外部compare_refs()
函数。请注意,在外部函数中,我们没有
"ignore_case"
标志,因为它是每个ref_sorting
元素的一部分。这种后备应该做什么是有争议的,因为我们没有使用用户的键来匹配。 但直到现在,我们一直在努力尊重这面旗帜,所以最小的侵入性就是尝试继续这样做。 由于当前代码中的所有调用者要么为所有键设置标志,要么不为任何键设置标志,我们可以从第一个键中提取标志。在一个假设的世界中,用户确实可以分别翻转不区分大小写的键,我们可能希望扩展代码以区分这种情况与毯子“--ignore-case
”。
“git branch --sort
”的实现(man) wrt 分离的 HEAD 显示器一直是 hacky,已使用 Git 2.31(2021 年第一季度)进行了清理。
请参阅commit 4045f65、commit 2708ce6、commit 7c269a7、commit d094748、commit 75c50e5(2021 年 1 月 7 日)和commit 08bf6a8、commit ffdd02a(2021 年 1 月 6 日)Ævar Arnfjörð Bjarmason (avar
)。(2021 年 1 月 25 日由 Junio C Hamano -- gitster
-- 在 commit 9e409d7 中合并)
branch
: 在反向排序下首先显示“HEAD detached”签字人:Ævar Arnfjörð Bjarmason
更改“
git branch -l --sort=-objectsize
”之类的输出(man) 以在输出开头显示“(HEAD detached at <hash>)
”消息。 在之前的提交中添加compare_detached_head()
函数之前,我们会将此输出作为紧急效果发出。出于排序目的考虑“
(HEAD detached at <hash>)
”消息的对象大小、类型或其他非属性没有任何意义。 让我们始终在顶部发出它。 它首先被排序的唯一原因是因为我们将它注入到 ref-filter 机器中,所以builtin/branch.c
不需要自己做“我分离了吗?”检测。
对于 Git 2.35(2022 年第一季度),诸如“git -c branch.sort=bogus branch new HEAD
”(man) 之类的内容,即
"git branch
"(man) 命令的操作模式不需要排序键信息,不再因看到伪造排序键而出错。
参见Junio C Hamano (gitster
)commit 98e7ab6、commit 1a89796(2021 年 10 月 20 日)。(由 Junio C Hamano -- gitster
-- 合并于 commit 5126145,2021 年 11 月 29 日)
for-each-ref
:延迟解析--sort=<atom>
选项
for-each-ref
系列命令在看到每个--sort=<atom>
选项时会立即调用解析器,并且在无法识别<atom>
时甚至在命令行上看到其他选项之前就死了。相反,将它们累积在一个字符串列表中,并在命令行解析完成后将它们解析为
ref_sorting
结构。 因此,“git branch --sort=bogus -h
”(man) 过去未能提供简短的帮助,这可能是一个功能,现在这样做了,这与其他选项的方式更加一致工作。
【讨论】:
要使用此选项列出遥控器,请添加-r
@TroyDaniels 同意。您可以编辑答案。我会审核您的修改。【参考方案9】:
其他答案似乎不允许通过 -vv
获得详细输出。
所以这里有一个单行代码,按提交日期、保留颜色等对 git branch -vv
进行排序:
git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk 'print $2' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2
如果你还想打印提交日期,你可以改用这个版本:
git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk 'print $2' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-
样本输出:
2013-09-15 master da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09 my-feature e5e6b4b [master: ahead 2, behind 25] WIP
拆分成多行可能更具可读性:
git branch -vv --color=always | while read; do
# The underscore is because the active branch is preceded by a '*', and
# for awk I need the columns to line up. The perl call is to strip out
# ansi colors; if you don't pass --color=always above you can skip this
local branch=$(echo "_$REPLY" | awk 'print $2' | perl -pe 's/\e\[?.*?[\@-~]//g')
# git log fails when you pass a detached head as a branch name.
# Hide the error and get the date of the current head.
local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-
这也应该与git branch
的其他参数一起使用,例如-vvr
列出远程跟踪分支,或-vva
列出远程跟踪和本地分支。
【讨论】:
-vv
确实很有用,谢谢。但是,此解决方案仍会为每个分支生成新进程,这是 OP 想要避免的。
其实git branch
并没有具体定义-vv
的含义,只是-v
的含义,所以-vv
应该和-v
一样。
这是最好的。添加 -avv 使其也考虑到远程分支。谢谢!
@musiphil 我的 git 分支 手册页,-v, -vv, --verbose
部分包含以下内容:If given twice, print the name of the upstream branch, as well
@Perleone:我不知道我是如何得到这些信息的,但你是对的,我是正确的。谢谢!【参考方案10】:
从 Git 2.19 开始,您可以简单地:
git branch --sort=-committerdate
您还可以:
git config branch.sort -committerdate
因此,每当您列出当前存储库中的分支时,它将按提交日期排序。
如果您列出分支时,您希望它们按提交日期排序:
git config --global branch.sort -committerdate
免责声明:我是Git这个功能的作者,看到这个问题就实现了。
【讨论】:
最新答案,比使用复杂的脚本或别名要容易得多? 谨慎使用! 大家注意,这不是列出分支的命令。这是一个更改 Git 配置的命令,将产生永久的全球影响。 @Jazimov 你是对的,我编辑了答案,所以它更清楚【参考方案11】:我喜欢使用相对日期并像这样缩短分支名称:
git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads
这会给你输出:
21 minutes ago nathan/a_recent_branch
6 hours ago master
27 hours ago nathan/some_other_branch
29 hours ago branch_c
6 days ago branch_d
我建议制作一个 Bash 文件来添加您喜欢的所有别名,然后将脚本分享给您的团队。这是一个仅添加这个的示例:
#!/bin/sh
git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"
然后您可以这样做以获得格式良好且排序良好的本地分支列表:
git branches
更新:如果您想着色,请执行此操作:
#!/bin/sh
#
(echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
【讨论】:
这给了我fatal: unknown field name: '-authordate:iso8601'
花哨的彩色输出很漂亮,但这很简单,正是我想要的。将refs/heads
替换为refs/remotes
以查看远程分支。
命令本身很可爱,但是别名抛出错误:expansion of alias 'branches' failed; 'echo' is not a git command
为我工作。如果您只是将其复制粘贴到终端会发生什么? (echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
【参考方案12】:
添加一些颜色(因为pretty-format
不可用)
[alias]
branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"
【讨论】:
【参考方案13】:我想出了以下命令(适用于 Git 2.13 及更高版本):
git branch -r --sort=creatordate \
--format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
| grep -v ";HEAD$" \
| column -s ";" -t
如果您没有column
,您可以将最后一行替换为
| sed -e "s/;/\t/g"
输出看起来像
6 years ago Tom Preston-Werner book
4 years, 4 months ago Parker Moore 0.12.1-release
4 years ago Matt Rogers 1.0-branch
3 years, 11 months ago Matt Rogers 1.2_branch
3 years, 1 month ago Parker Moore v1-stable
12 months ago Ben Balter pages-as-documents
10 months ago Jordon Bedwell make-jekyll-parallel
6 months ago Pat Hawks to_integer
5 months ago Parker Moore 3.4-stable-backport-5920
4 months ago Parker Moore yajl-ruby-2-4-patch
4 weeks ago Parker Moore 3.4-stable
3 weeks ago Parker Moore rouge-1-and-2
19 hours ago jekyllbot master
我写了a blog post 来介绍各个部分的工作原理。
【讨论】:
不错。 +1。它确实使用了我在***.com/a/33163401/6309 中提到的git branch --sort
。
@DanNissenbaum 确保您使用的是 Git 2.13(2017 年 5 月发布)或更高版本。【参考方案14】:
我遇到了同样的问题,所以我写了一个名为 Twig 的 Ruby gem。它按时间顺序列出分支(最新的优先),还可以让您设置最大年龄,这样您就不会列出所有分支(如果有很多分支)。例如:
$ twig
issue status todo branch
----- ------ ---- ------
2013-01-26 18:00:21 (7m ago) 486 In progress Rebase optimize-all-the-things
2013-01-26 16:49:21 (2h ago) 268 In progress - whitespace-all-the-things
2013-01-23 18:35:21 (3d ago) 159 Shipped Test in prod * refactor-all-the-things
2013-01-22 17:12:09 (4d ago) - - - development
2013-01-20 19:45:42 (6d ago) - - - master
它还允许您存储每个分支的自定义属性,例如票证 ID、状态、待办事项,并根据这些属性过滤分支列表。更多信息:http://rondevera.github.io/twig/
【讨论】:
这个名字可能没有帮助,因为我很确定那里有一些同名的软件。【参考方案15】:仅供参考,如果您想获得最近签出分支的列表(而不是最近提交的),您可以使用 Git 的 reflog:
$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk ' print $3 ' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything
另请参阅:How can I get a list of Git branches that I've recently checked out?
【讨论】:
【参考方案16】:这是我用来在最近的分支之间切换的小脚本:
#!/bin/bash
# sudo bash
re='^[0-9]+$'
if [[ "$1" =~ $re ]]; then
lines="$1"
else
lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"
# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
echo -n "Checkout to: "
read index
done
branch="$( echo "$branches_nf" | sed -n "$indexp" | awk ' print $NF ' )"
git co $branch
clear
使用这两个别名:
recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'
只需在 Git 存储库中调用它,它就会显示最后 N 个分支(默认为 10 个)以及每个分支旁边的一个数字。输入分行号,结账:
【讨论】:
【参考方案17】:另一种变化:
git branch -r --sort=-committerdate --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always | column -ts'|'
值得注意的是,即使它正在查看远程分支中的更改,也值得在运行命令之前与 origin 同步(可以使用 git fetch),因为我发现如果您的本地 Git 文件夹没有返回过时信息过段时间更新了。
另外,这是一个在 Windows cmd 和 PowerShell 中工作的版本(没有得到显示在列中的输出,有兴趣看看是否有人得到这个工作):
git branch -r --sort=-committerdate --format="%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)" --color=always
【讨论】:
感谢 VonC,感谢您的反馈。 感谢 Windows Cmd/Powershell 的回答。我可以确认它也适用于 Cmder。【参考方案18】:通常我们最近会考虑远程分支。所以试试这个
git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin
【讨论】:
【参考方案19】:这是另一个脚本,它执行所有其他脚本所做的事情。事实上,它为你的 shell 提供了一个功能。
它的贡献在于它从你的 Git 配置中提取了一些颜色(或使用默认值)。
# Git Branch by Date
# Usage: gbd [ -r ]
gbd()
local reset_color=`tput sgr0`
local subject_color=`tput setaf 4 ; tput bold`
local author_color=`tput setaf 6`
local target=refs/heads
local branch_color=`git config --get-color color.branch.local white`
if [ "$1" = -r ]
then
target=refs/remotes/origin
branch_color=`git config --get-color color.branch.remote red`
fi
git for-each-ref --sort=committerdate $target --format="$branch_color%(refname:short)$reset_color $subject_color%(subject)$reset_color $author_color- %(authorname) (%(committerdate:relative))$reset_color"
【讨论】:
【参考方案20】:这是基于saeedgnu's version,但当前分支以星号和颜色显示,并且仅显示未描述为“月”或“年”之前的任何内容:
current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
--format='%(refname:short)|%(committerdate:relative)' \
| grep -v '\(year\|month\)s\? ago' \
| while IFS='|' read branch date
do
start=' '
end=''
if [[ $branch = $current_branch ]]; then
start='* \e[32m'
end='\e[0m'
fi
printf "$start%-30s %s$end\\n" "$branch" "$date"
done
【讨论】:
【参考方案21】:我作为脚本的最佳成绩:
git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
sed 's/refs\/heads\///g' |
grep -v BACKUP |
while IFS='|' read branch date author
do
printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
done
【讨论】:
什么样的脚本?重击?【参考方案22】:git branch --sort=-committerdate | head -5
对于任何有兴趣仅根据提交者日期排序前 5 个分支名称的人。
【讨论】:
【参考方案23】:The accepted command-line answer 摇滚,但如果你想要更漂亮的东西,比如 GUI,并且你的来源 === “github”。
您可以单击存储库中的“分支”。或者直接点击网址:https://github.com/ORGANIZATION_NAME/REPO_NAME/branches
【讨论】:
【参考方案24】:在 Mac 上尝试设置别名时,在 bash_profile 中处理单引号时遇到了一些问题。这个答案帮助解决了它“How to escape single quotes within single quoted strings
工作解决方案:
alias gb='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))'"'"''
附:由于我的声誉,无法发表评论
【讨论】:
【参考方案25】:最简单的与最后提交日期一起打印:
git branch --all --format='%(committerdate:short) %(refname:short)'|sort
【讨论】:
【参考方案26】:git for-each-ref --sort=-committerdate refs/heads/
# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate # DESC
git branch --sort=committerdate # ASC
【讨论】:
【参考方案27】:这是我正在寻找的变体:
git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r
tail -r
反转列表,因此最近的 commiterdate
排在最后。
【讨论】:
您也可以将 --sort=-committerdate 更改为 --sort=committerdate 来完成此操作。 哪个tail
有-r
?【参考方案28】:
我将接受答案的输出通过管道传输到dialog
,给我一个交互式列表:
#!/bin/bash
TMP_FILE=/tmp/selected-git-branch
eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE
if [ $? -eq 0 ]
then
git checkout $(< $TMP_FILE)
fi
rm -f $TMP_FILE
clear
另存为(例如)~/bin/git_recent_branches.sh
和 chmod +x
。然后git config --global alias.rb '!git_recent_branches.sh'
给我一个新的git rb
命令。
【讨论】:
【参考方案29】:我知道已经有很多答案了,但这是我的两分钱一个简单的别名(我喜欢把我最近的分支放在底部):
[alias]
br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
current = yellow
local = cyan
remote = red
这将为您提供最新的 15 个分支的概览,以颜色显示,当前分支突出显示(并且带有星号)。
【讨论】:
【参考方案30】:我发现以下命令对我的目的很有帮助。
git branch --sort=-committerdate | head -n 10
这将列出最新的 10 个分支。它很短,也可以在没有别名的情况下使用。
【讨论】:
以上是关于如何获取按最近提交排序的 Git 分支列表?的主要内容,如果未能解决你的问题,请参考以下文章