在git中列出每个分支及其最后修订的日期

Ron*_*niv 130 git maintenance branch administration

我需要从远程仓库中删除旧的和未维护的分支.我正试图找到一种方法来列出他们上次修改日期的远程分支,但我不能.

有人知道以这种方式列出远程分支的简单方法吗?

Von*_*onC 162

commandlinefu有两个有趣的命题:

for k in `git branch | perl -pe s/^..//`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
Run Code Online (Sandbox Code Playgroud)

要么:

for k in `git branch | sed s/^..//`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k --`\\t"$k";done | sort
Run Code Online (Sandbox Code Playgroud)

这是针对本地分支的Unix语法.使用git branch -r,您可以类似地显示远程分支:

for k in `git branch -r | perl -pe 's/^..(.*?)( ->.*)?$/\1/'`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
Run Code Online (Sandbox Code Playgroud)

Michael Forrest 在评论中提到zsh需要sed表达式的转义:

for k in git branch | perl -pe s\/\^\.\.\/\/; do echo -e git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1\\t$k; done | sort -r 
Run Code Online (Sandbox Code Playgroud)

kontinuity 在评论中添加:

如果你想在zshrc中添加它,则需要以下转义.

alias gbage='for k in `git branch -r | perl -pe '\''s/^..(.*?)( ->.*)?$/\1/'\''`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r'
Run Code Online (Sandbox Code Playgroud)

在多行中:

alias gbage='for k in `git branch -r | \
  perl -pe '\''s/^..(.*?)( ->.*)?$/\1/'\''`; \
  do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | \
     head -n 1`\\t$k; done | sort -r'
Run Code Online (Sandbox Code Playgroud)


ocr*_*tte 107

这是我使用的:

git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
Run Code Online (Sandbox Code Playgroud)

这是输出:

2014-01-22 11:43:18 +0100       refs/heads/master
2014-01-22 11:43:18 +0100       refs/heads/a
2014-01-17 12:34:01 +0100       refs/heads/b
2014-01-14 15:58:33 +0100       refs/heads/maint
2013-12-11 14:20:06 +0100       refs/heads/d/e
2013-12-09 12:48:04 +0100       refs/heads/f
Run Code Online (Sandbox Code Playgroud)

对于远程分支,只需使用"refs/remotes"而不是"refs/heads":

git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/remotes
Run Code Online (Sandbox Code Playgroud)

您可能需要先调用"git fetch --prune"才能获得最新信息.

  • 很好地使用for-each-ref和格式选项.+1.听起来比我在自己的答案中引用的命令更容易. (5认同)
  • 稍微调整一下:------- git for-each-ref --sort ='-authordate:iso8601'--format ='%(authordate:relative)%09%(refname:short)'refs / heads -------给您一个相对的日期并消除裁判/裁判 (2认同)

n8t*_*8tr 21

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

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads
Run Code Online (Sandbox Code Playgroud)

哪个给你输出:

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
Run Code Online (Sandbox Code Playgroud)

我建议制作一个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 ' ------------------------------------------------------------'"
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做以获得一个格式良好和排序的本地分支列表:

git branches
Run Code Online (Sandbox Code Playgroud)


yng*_*gve 19

只需添加@VonC的评论,请将您的首选解决方案添加到〜/ .gitconfig别名列表中以方便:

[alias]  
    branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'
Run Code Online (Sandbox Code Playgroud)

然后一个简单的"git branchdate"为你打印列表......

  • +1用于显示如何与.gitconfig一起使用它!另外fwiw我将格式字符串更改为:`--format ='%(authordate)%09%(objectname:short)%09%(refname)'`它也获取每个分支的短哈希值. (3认同)

shw*_*eta 5

对远程分支进行排序以及每个分支的最后提交日期。

for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r
Run Code Online (Sandbox Code Playgroud)

  • 感谢您回答有关远程的OP问题。 (2认同)

go2*_*ull 5

是我在审查之后得出的结论。

for REF in $(git for-each-ref --sort=-committerdate --format="%(objectname)" \
    refs/remotes refs/heads)
do
    if [ "$PREV_REF" != "$REF" ]; then
        PREV_REF=$REF
        git log -n1 $REF --date=short \
            --pretty=format:"%C(auto)%ad %h%d %s %C(yellow)[%an]%C(reset)"
    fi
done
Run Code Online (Sandbox Code Playgroud)

PREV_REF如果多个分支指向同一提交,则检查的目的是删除重复项。(就像在远程分支中也存在的本地分支一样。)

请注意,根据 OP 请求,git branch --mergedgit branch --no-merged有助于识别哪些分支可以轻松删除。

[ https://git-scm.com/docs/git-branch]


归档时间:

查看次数:

40119 次

最近记录:

6 年 前