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
要么:
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
这是针对本地分支的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
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 
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'
在多行中:
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'
ocr*_*tte 107
这是我使用的:
git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
这是输出:
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
对于远程分支,只需使用"refs/remotes"而不是"refs/heads":
git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/remotes
您可能需要先调用"git fetch --prune"才能获得最新信息.
n8t*_*8tr 21
建立Olivier Croquette,我喜欢使用相对日期并缩短分支名称,如下所示:
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
yng*_*gve 19
只需添加@VonC的评论,请将您的首选解决方案添加到〜/ .gitconfig别名列表中以方便:
[alias]  
    branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'
然后一个简单的"git branchdate"为你打印列表......
对远程分支进行排序以及每个分支的最后提交日期。
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
这是我在审查之后得出的结论。
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
PREV_REF如果多个分支指向同一提交,则检查的目的是删除重复项。(就像在远程分支中也存在的本地分支一样。)
请注意,根据 OP 请求,git branch --merged和git branch --no-merged有助于识别哪些分支可以轻松删除。
[ https://git-scm.com/docs/git-branch]
| 归档时间: | 
 | 
| 查看次数: | 40119 次 | 
| 最近记录: |