如何获取按最近提交排序的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个回答

5

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

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

5
这是另一个与其他脚本相同的脚本,实际上,它为您的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}"
}

4
这是基于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

3

最简单的方法是输出最后提交日期:

git branch --all  --format='%(committerdate:short) %(refname:short)'|sort

3
git for-each-ref --sort=-committerdate refs/heads/

# Or using Git branch (since version 2.7.0)
git branch --sort=-committerdate  # Descending
git branch --sort=committerdate  # Ascending

需要解释一下。例如,这个想法/要点是什么?它与之前的30个答案有何不同之处?来自帮助中心“...始终解释为什么您提出的解决方案是合适的以及它是如何工作的”。请通过编辑(更改)您的答案进行回复,而不是在此处进行评论(不要添加“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

3

我作为脚本的最佳结果:

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
什么类型的脚本?Bash? - Peter Mortensen

3

2
这是我在寻找的变量:
git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

那个 tail -r 命令可以将列表反转,所以最近的 commiterdate 在最后面。

4
您可以将--sort=-committerdate更改为--sort=committerdate来实现此目的。 - rephorm
哪个tail-r选项? - Christoffer Hammarström

2
我知道已经有很多答案了,但这是我对于一个简单的别名的建议(我喜欢将最近的分支放在底部): "最初的回答"
[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

这将为您提供最新的15个分支的漂亮概述,以彩色显示,并突出显示您当前的分支(它有一个星号)。原始回答: "最初的回答"

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

将其保存为 (例如) ~/bin/git_recent_branches.shchmod +x 它。然后执行 git config --global alias.rb '!git_recent_branches.sh' 以给我一个新的 git rb 命令。


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