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

1970
我想要获取一个Git仓库中所有分支的列表,并将“最新”的分支排在前面,其中“最新”的分支是最近提交的分支(因此更可能是我想要关注的分支)。
是否有一种方法可以使用Git来按照最新提交对分支列表进行排序,或者以某种机器可读的格式获取包括每个分支的最后提交日期的分支列表?
最坏情况下,我可以始终运行“git branch”以获取所有分支的列表,解析其输出,然后为每个分支运行“git log -n 1 branchname --format=format:%ci”以获取每个分支的提交日期。但这将在Windows环境中运行,其中启动新进程相对较昂贵,因此如果有很多分支,每个分支启动一次Git可执行文件可能会变慢。是否有一种方法可以用单个命令完成所有这些操作?

3
有更好的答案。 - Spundun
18
@Spundun,你让我有些摸不着头脑。使用包括通过perl和sed的管道传输的多个命令组合,“比”使用Git已经具备的命令“更好”,这是怎么回事? - Joe White
50
关于Jakub Narębski提供的使用git for-each-ref命令的答案,您可以通过传递refs/remotes/(而不是refs/heads/)来获取远程分支(或者您可以同时传递两者,用空格隔开);对于标签,请使用refs/tags/,要获取所有三种引用,则可以使用refs/ - jakub.g
10
自从Git 2.7(2015年第四季度)开始,就不再使用for-each-ref命令了!您应该直接使用git branch --sort=-committerdate命令:请参见我的回答 - VonC
1
@JoeWhite 它仍然可用,但其语义的一部分将直接从 git 分支本身访问。 - VonC
显示剩余5条评论
32个回答

1

我没有找到完全符合我要求的内容,因此这是基于https://dev59.com/wG435IYBdhLWcg3w1juV#66134817的版本,它具有以下功能:

  • 在Windows下工作(但必须安装awk - 我的是与MinGW一起安装的,也可以通过Git,Cygwin等进行安装)
  • 不是基于复杂别名可用作命令行/脚本中的单行代码
  • 具有颜色
  • 使用最近的git branch --sort=committerdate
  • 输出对齐到列

所以这就是它:

git branch -a --sort=committerdate --format='%(HEAD)%(color:yellow)%(refname:short)@SEP@%(color:bold green)%(committerdate:relative)@SEP@%(color:magenta)%(authorname)%(color:reset)@SEP@%(color:blue)%(subject)' --color=always | awk -F "@SEP@" '{printf("%-100s %-30s %-20s %s \n", $1, $2, $3, $4)}'

当在cmd脚本中时,必须修改它以处理%

git branch -a --sort=committerdate --format="%%(HEAD)%%(color:yellow)%%(refname:short)@SEP@%%(color:bold green)%%(committerdate:relative)@SEP@%%(color:magenta)%%(authorname)%%(color:reset)@SEP@%%(color:blue)%%(subject)" --color=always | awk -F "@SEP@" '{printf("%%-100s %%-30s %%-20s %%s \n", $1, $2, $3, $4)}'

openapi-generator github repo 的屏幕截图

注意事项和操作方法:

  • 使用 --sort=-committerdate 命令可以反转排序顺序
  • awk printf 规范中的数字和连字符 "%-100s %-30s %-20s %s \n" 是列长度和对齐规范,因此这是一个自定义的地方
  • @SEP@ 用作唯一分隔符字符串,然后 awk 使用 -F "@SEP" 来匹配数据列。这可能有些过度,但可以避免在使用某些简单分隔符时出现意外混淆

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接