列出所有没有远程的本地分支

问题:我想要删除所有没有远程的本地分支。 把分支的名字转换成一个git branch -D {branch_name}是很容易的,但是我怎样才能得到这个列表呢?

例如:

我创build了一个没有远程的新分支:

 $ git co -b no_upstream 

我列出了所有的分支机构,只有一个遥控器

 $ git branch -a master * no_upstream remotes/origin/HEAD -> origin/master remotes/origin/master 

我可以运行什么命令来获取no_upstream作为答案?

我可以运行git rev-parse --abbrev-ref --symbolic-full-name @{u} ,这将显示它没有remote:

 $ git rev-parse --abbrev-ref --symbolic-full-name @{u} error: No upstream configured for branch 'no_upstream' error: No upstream configured for branch 'no_upstream' fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' 

但是,由于这是一个错误,它不会让我使用它或pipe道到其他命令。 我打算使用这个作为一个shell脚本别名git-delete-unbranched或者可能做一个超级简单的Gem像git-branch-delete-orphans

任何帮助,将不胜感激! 谢谢

我最近发现git branch -vvgit branch命令的“非常详细”的版本。

它与远程分支一起输出分支(如果存在的话),格式如下:

  25-timeout-error-with-many-targets 206a5fa WIP: batch insert 31-target-suggestions f5bdce6 [origin/31-target-suggestions] Create target suggestion for team and list on save * 54-feedback-link b98e97c [origin/54-feedback-link] WIP: Feedback link in mail 65-digest-double-publish 2de4150 WIP: publishing-state 

一旦你有这个很好的格式化输出,就像通过cutawk来获取你的列表一样简单:

 git branch -vv | cut -c 3- | awk '$3 !~/\[/ { print $1 }' 

结果如下输出:

 25-timeout-error-with-many-targets 65-digest-double-publish 

cut部分只是通过从输出中移除前两个字符(包括* )来标准化数据,然后将其传递给awk

如果第三列中没有方括号,则awk部分将打印第一列。

奖金:创build一个别名

通过在全局.gitconfig文件(或任何地方)中创build一个别名来运行它很容易:

 [alias] local-branches = !git branch -vv | cut -c 3- | awk '$3 !~/\\[/ { print $1 }' 

重要提示:反斜杠需要在别名中转义,否则您的gitconfig文件将会失效。

奖金:远程过滤

如果由于某种原因,您有不同分支的多个追踪遥控器,指定您要检查的遥控器是很容易的。 只需将远程名称附加到awk模式即可。 在我的情况下,它的origin所以我可以做到这一点:

 git branch -vv | cut -c 3- | awk '$3 !~/\[origin/ { print $1 }' 

git branch (没有任何选项)只列出本地分支,但你不知道他们是否跟踪远程分支。

通常,这些本地分支一旦合并到master应该被删除(如在这个git-sweep的问题中所见):

 git branch --merged master | grep -v master | xargs git branch -d 

这不是你想要的完整,但是这是一个开始。

使用--merged ,只有分支合并到指定的提交(即提交的提交可以从指定的提交到达的分支)将被列出。

晚编辑:更好

 git for-each-ref --format='%(refname:short) %(upstream)' refs/heads \ | awk '$2 !~/^refs\/remotes/' 

在GNU /任何东西

 for b in `git branch|sed s,..,,`; do git config --get branch.$b.remote|sed Q1 && echo git branch -D $b done 

如果不止一个分支可能会有更好的方法,使用git branch|sed|sortgit config -l|sed|sort

我有一个类似的问题。 我想删除所有跟踪现在被删除的远程分支的本地分支。 我发现git remote prune origin不足以删除我想要去的分支。 一旦遥控器被删除,我想让本地也消失。 这是什么对我有用:

从我的~/.gitconfig

 [alias] prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d 

这适用于我:

git branch -vv | grep -v origin

(如果您的遥控器被命名为非原产地,则replace它)。

这将列出所有不跟踪远程的分支,这听起来像你正在寻找的。

粗糙的PowerShell实施:(如果来源是你唯一的远程)

 @($branches = git br -r; git branch | %{ echo $_ | sed 's/..//' }) ` | %{ if (($branches | ss "origin/$_") -eq $null) { ` echo "git branch -D $_" ` } ` }