列出所有没有远程的本地分支
问题:我想要删除所有没有远程的本地分支。 把分支的名字转换成一个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 -vv
是git 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
一旦你有这个很好的格式化输出,就像通过cut
和awk
来获取你的列表一样简单:
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|sort
和git 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 $_" ` } ` }