如何获得按最近提交顺序排序的Git分支列表?


1322

我想获得Git存储库中所有分支的列表,顶部是“最新鲜”的分支,“最新鲜”的分支是最近提交的分支(因此,更有可能成为一个分支)。我要注意)。

有什么方法可以使用Git来(a)按最新提交对分支列表进行排序,或者(b)以某种机器可读的格式获取分支列表以及每个成员的上次提交日期?

最坏的情况是,我总是可以运行git branch以获取所有分支的列表,解析其输出,然后git log -n 1 branchname --format=format:%ci为每个分支获取每个分支的提交日期。但这将在Windows机器上运行,在Windows机器上启动新进程的成本相对较高,因此,如果有很多分支,则每个分支一次启动Git可执行文件可能会变慢。有没有办法用一个命令来完成所有这些工作?


2
stackoverflow.com/a/2514279/1804124有一个更好的答案。
Spundun

12
@Spundun,你在那里迷失了我。与使用Git已经拥有的命令相比,包括perl和sed的内容在内的多个命令如何组合起来“更好”?
乔·怀特

36
@Spundun关于JakubNarębski的回答git for-each-ref:您可以传递远程分支,refs/remotes/而不是refs/heads/(或者可以传递,用空格分隔);refs/tags/标签,或仅refs/适用于所有三种标签。
jakub.g 2013年

4
从git 2.7(Q4 2015)开始,不再for-each-ref!您将直接使用git branch --sort=-committerdate:请在下面
VonC 2015年

Answers:


1873

使用--sort=-committerdate选项git for-each-ref;

从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))'

结果:

结果


15
完善!我甚至可以通过追加将输出限制为仅引用名称--format=%(refname)
乔·怀特

35
这对我来说更好:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu 2012年

2
@ilius:为什么不使用:shortname
JakubNarębski2012年

37
@ilius:正如@BeauSmith写道:git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/。git-for-each-ref(1)联机帮助页说:对于ref append的明确名称:short
JakubNarębski'12

76
这是一个彩色版本,包括哈希值,消息,根据提交日期升序排列以及每个分支上最后一次提交的相对年龄。我从上面的你们那里窃取了所有想法。它在本[alias]节的.gitconfig中,我喜欢它。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))'
Michael Percy 2015年

124

Git分支名称列表,按最新提交顺序排序…

扩展Jakub的答案Joe的技巧,以下内容将去除“ refs / heads /”,因此输出仅显示分支名称:


命令:

git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

结果:

最近的Git分支


4
您也可以使用--format=%(refname:short)而不是依赖cut
Chaitanya Gupta的

3
有什么办法可以对REMOTE存储库执行此操作吗?
Allan Bowe 2014年

10
aah-@ jakub.g已经说明:您可以通过refs / remotes /而不是refs / heads /来获得远程分支。完善!!
Allan Bowe 2014年

我喜欢这个,如果您想给它git rb加上别名,我记得记住用双引号将该命令括起来:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Michael Discenza

2
现在,您可以使用来执行此操作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))'
2014年

89

这是最佳的代码,结合了其他两个答案:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'

10
甚至稍微优化了mor,以获得表格格式的输出:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi 2013年

2
由于某种原因,我不得不在Windows上使用双引号,但否则这些就可以了:)
amenthes

1
@schoetbi该代码看起来与nikolay的代码完全一样,您对它进行了哪些更改以使其变得表格化?
恩里科

@Enrico和其他可能对同一件事感到疑惑的人。尼古拉(Nikolay)使用schoetbis的建议改变了答案。通过先移动始终相同长度的日期,结果看起来更加表格化。
约翰尼

83

这是一个简单的命令,列出了所有具有最新提交的分支:

git branch -v

要根据最近的提交进行排序,请使用

git branch -v --sort=committerdate

来源:http//git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -av如果您也想查看非本地分支机构。
Scott Stafford 2014年

34
这不会按问题按提交日期排序。
–'Cas

1
git branch -v列出列出的每个提交的日期是否容易?
dumbledad

1
<pre> git branch -v --sort = committerdate </ pre>怎么样?
iraj jelodari '16

2
这太棒了。我喜欢git branch -va --sort=-committerdate显示非本地分支,顶部显示最近更改的分支。
克林顿·布莱克摩尔

61

我使用以下别名:

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"

产生:

结果

使用“ |” 分开。


1
大别名!column -ts'|'如果逗号可以出现在您的语言环境中的相对时间戳内,我会建议并添加字符。
比昂·林德奎斯特

1
很好的别名,非常感谢。您能否改进它以其他颜色或在开头显示*来显示当前分支?
elhadi dpıpɐɥןǝ2015年

2
至少在最新版本的git中,您只需'%(HEAD) ...'在格式字符串的开头添加即可获得相同的效果,而无需通过sed命令
传递

5
我无法将其用作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'|'
Wesley Smith

11
我必须添加--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'|'}
user3342930

40

我能够参考前面的示例来创建最适合我的东西。

git for-each-ref --sort = -committerdate refs / heads / --format ='%(authordate:short)%(color:red)%(objectname:short)%(color:yellow)%(refname:short )%(颜色:重置)(%(颜色:绿色)%(提交日期:相对)%(颜色:重置))'

输出屏幕截图


1
看起来不错,比我在stackoverflow.com/a/33163401/6309中建议的直接使用git branch更加丰富多彩。+1
VonC

2
与其他一些人不同,这个人对我来说是开箱即用的,所以我投了赞成票。
Casey

1
真的很不错!谢谢!:-)
FrozenTarzan

1
同上-与我刚尝试过的其他方法不同,该方法即开即用。谢谢。
Dan Nissenbaum

2
这是干净整洁的。有时我会这样添加远程名和作者名: 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))'
ywu

38

我还需要没有重复的颜色,标签和远程引用:

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'"]++'"

$ <此处的命令> awk:1行附近的语法错误awk:1行附近的救援
Jamie Mason

@GotNoSugarBaby您正在使用单引号,例如示例吧?您正在使用哪个外壳?Bash赋予该字符特殊的含义。
estani

嘿,我在/ bin / bash(GNU bash,版本4.0.28(1)-发行版(i386-pc-solaris2.11))上运行了该示例,并直接复制并粘贴了您的示例—但从那时起,我就开始运行它在/ bin / bash(GNU bash,版本3.2.48(1)-发行版(x86_64-apple-darwin12))上起作用,因此我将删除不赞成投票的人。非常感谢estani。
杰米·梅森

@GotNoSugarBaby我在3.x上尝试使用4.2.25(1)-release(x86_64-pc-linux-gnu)nad并成功运行。我不确定这是什么问题...但是它可能与git版本相关,而不是bash问题。无论如何,我很高兴为您服务!
estani

1
@MichaelDiscenza只是把所有东西都送到了头上。那将是| head -n20最后添加。如果您使用别名,请确保它引号内。
estani 2015年

24

其他答案似乎不允许通过-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希望避免的每个分支产生新的流程。
musiphil 2014年

实际上git branch,并未具体定义的含义-vv,而仅定义的含义-v,因此-vv应与相同-v
musiphil 2014年

2
这是最好的。并且添加-avv使其也考虑了远程分支。谢谢你!
Gopherkhan 2015年

@musiphil我的git分支手册页中的部分-v, -vv, --verbose包含以下内容:If given twice, print the name of the upstream branch, as well
Perleone 2015年

@Perleone:我不知道我是怎么得到这些信息的,但是你是对的,我会得到纠正。谢谢!
musiphil

23

git 2.7(Q4 2015)将直接使用分支排序git branch
请参见commit aa3bc55commit aedcb7dcommit 1511b22commit f65f139,...(2015年9月23日),commit aedcb7dcommit 1511b22commit ca41799(2015年9月24日)和由Karthik Nayak(提交f65f139,...(2015年9月23日(由Junio C Hamano合并--commit 7f11b48中,2015年10月15日)KarthikNayak
gitster

特别是,提交aedcb7d

branch.c:使用' ref-filter'API

使' branch.c' ref-filteruse''API遍历引用排序。这将删除在' branch.c'中使用的大多数代码,以对' ref-filter'库的调用来替换它。

添加了选项--sort=<key>

根据给定的键排序。
前缀-以值的降序排序。

您可以--sort=<key>多次使用该选项,在这种情况下,最后一个键成为主键。

支持的键与中git for-each-ref的键相同
排序顺序默认为基于完整的refname(包括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

另请参见Karthik Nayak()的commit 9e46833(2015年10月30日。 帮助:Junio C Hamano((通过合并JUNIOÇ滨野- -提交415095f,2015年11月3日)KarthikNayak
gitster
gitster

当按数值排序时(例如--sort=objectsize),当两个引用保持相同的值时,就没有回退比较。如Johannes Sixt($ gmane / 280117)所指出的,这可能会导致意外结果(即无法预先确定具有相同值的引用的排列顺序)。

因此,只要其他条件相等,就退回到基于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(``)提交560ae1c(2018年8月16日
(由Junio C gitsterHamano合并--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进行平局方面存在一些缺陷,这些问题已得到修复。

参见Jeff King(提交7c5045f76f9e56(2020年5月3日(由Junio C Hamano合并--6de1630提交中,2020年5月8日)peff
gitster

ref-filter:仅在所有用户排序后才应用后备refname排序

签字人:杰夫·金

提交9e468334b4(“ ref-filter:按字母比较的后备”,2015-10-30,Git v2.7.0-rc0- 批号10中列出的合并)教导了ref-filter的后备排序以比较refname。 但这是在错误的级别上完成的,它覆盖了用户对单个“ ”键的比较结果,而不是在用尽所有排序键之后。
--sort

这对于单个“ --sort”选项正确运行,但对多个选项无效。
我们将打破第一个键与refname的联系,并且永远不会评估第二个键。

为了使事情变得更加有趣,我们有时仅应用此后备!
对于taggeremail需要字符串比较的 “ ”之类的字段strcmp(),即使它为0 ,我们也将真正返回结果。
但是对于“ value”之类的数字“ ”字段taggerdate,我们确实应用了后备。这就是为什么我们的多重排序测试没有做到这一点:它taggeremail用作主要比较。

因此,让我们从添加更严格的测试开始。我们将进行一组提交,以表达两个标记器电子邮件,日期和引用名的每种组合。然后,我们可以确认我们的排序以正确的优先级应用,并且将同时击中字符串和值比较器。

那确实显示了错误,并且解决方法很简单:compare_refs()在所有ref_sorting键都用完之后,将后备功能移到外部函数。

请注意,在外部函数中,我们没有"ignore_case"标志,因为它是每个单独ref_sorting元素的一部分。由于我们没有使用用户的键来进行匹配,因此应该如何回退,这值得商bat。
但是直到现在,我们一直在尝试尊重该标志,因此,侵入性最小的事情就是尝试继续这样做。
由于当前代码中的所有调用者都为所有键设置了标志,也没有为所有键设置标志,因此我们只需从第一个键中拉出标志即可。在一个假设的世界中,用户确实可以单独翻转键的大小写不敏感状态,我们可能需要扩展代码以区分该情况与“ --ignore-case”一词。


要列出使用此选项的遥控器,请添加-r
Troy Daniels '18

@TroyDaniels同意。您可以编辑答案。我将审查您的修改。
VonC

19

我喜欢使用相对日期并缩短分支名称,如下所示:

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'
Factor Mystic 2015年

1
花哨的彩色输出很不错,但这很简单,而且正是我想要的。替换refs/headsrefs/remotes以查看远程分支。
Lambart

该命令本身很可爱,但是别名引发错误:expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn,

为我工作。如果您仅将其粘贴到终端中,该怎么办?(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)$|$"
n8tr

17

从Git 2.19开始,您可以:

git branch --sort=-committerdate

你也可以:

git config branch.sort -committerdate

因此,只要您在当前存储库中列出分支,就会按committerdate对其进行列出。

如果每当您列出分支机构时,都希望它们按comitterdate排序:

git config --global branch.sort -committerdate

免责声明:我是Git中此功能的作者,当我看到此问题时便实现了它。


2
最新的答案,比使用复杂的脚本或别名容易得多
mtefi

请谨慎使用!当心大家,这不是列出分支的命令。这是更改Git配置的命令,它将对全球产生永久性的影响。
Jazimov '18

1
@Jazimov你说的对,我编辑了答案,这样更清楚了
user801247 '18

11

添加一些颜色(因为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"

9

我遇到了同样的问题,所以我写了一个名为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/


5
该名称可能无济于事,因为我很确定有几款具有相同名称的软件。
thoroc

8

我想出了以下命令(适用于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

我写了一篇关于各个部分如何工作的博客文章


真好 +1。它使用git branch --sort中提到我stackoverflow.com/a/33163401/6309
VonC

@DanNissenbaum确保您使用的是Git 2.13(于2017年5月发布)或更高版本。
bdesham

7

仅供参考,如果您想获取最近签出的分支机构列表(而不是最近提交的分支机构),则可以使用Git的reflog:

$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything

另请参阅:如何获取最近签出的Git分支列表?


5

这是一个我用来在最近的分支之间切换的小脚本:

#!/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 "${index}p" | 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个)和每个分支旁边的编号。输入分支的编号,然后检出:

在此处输入图片说明


4

通常我们会考虑最近的远程分支。所以试试这个

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

这是另一个脚本,它执行所有其他脚本的操作。实际上,它为您的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}"
}

3

这基于saeedgnu的版本,但是当前分支以星号和颜色显示,并且仅显示未描述为“月”或“年”的任何内容:

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

2

作为脚本的最佳成绩是:

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

1
什么样的脚本?重击?
彼得·莫滕森

2

git branch --sort=-committerdate | head -5

对于任何有兴趣获得仅基于提交者日期排序的前5个分支名称的人。



1

这是我正在寻找的变体:

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

tail -r逆转列表,以便使最近期的commiterdate是最后一次。


3
您也可以将--sort = -committerdate更改为--sort = committerdate以完成此操作。
rephorm

哪个tail-r
ChristofferHammarström2014年

1

我将接受的答案的输出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

另存为(EG)~/bin/git_recent_branches.shchmod +x它。然后git config --global alias.rb '!git_recent_branches.sh'给我一个新git rb命令。


1

我知道已经有很多答案了,但是这是我的两个美分,一个简单的别名(我喜欢在底部有我最近的分支):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

这将为您提供最新的15个分支的概览,这些分支将以彩色显示,并突出显示当前分支(并带有星号)。


1

尝试设置别名时,在Mac上的bash_profile中处理单引号时遇到了一些麻烦。此答案有助于解决它“ 如何在单引号引起来的字符串中转义单引号

工作解决方案:

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))'"'"''

PS由于我的声誉而无法发表评论


0

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))' 这是你需要的


0

Git v2.19引入了branch.sortconfig选项(请参阅branch.sort)。

因此git branch,默认情况下将按提交者日期(desc)排序

# gitconfig
[branch]
    sort = -committerdate     # desc

脚本:

$ git config --global branch.sort -committerdate

更新:

所以,

$ git branch
* dev
  master
  _

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.