2013-03-27 75 views
37

问题:我想要一种删除所有没有远程的本地分支的方法。将分支机构的名称输入到git branch -D {branch_name}很容易,但我怎么首先获取该列表?列出所有没有远程的本地分支

例如:

我创建一个没有遥控器一个新的分支:

$ git co -b no_upstream 

我列出我的所有分支,只有有1与远程

$ 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},这将表明它没有遥控:

$ 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>...]' 

但因为这是一个错误,它不会让我使用它或管道给其他命令。我打算使用这个作为shell脚本别名git-delete-unbranched或可能使一个超级简单的宝石像git-branch-delete-orphans

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

+0

另请参阅http://stackoverflow.com/questions/4950725/how-do-i-get-git-to-show-me-which-branches-are-tracking-what – 2014-03-17 16:25:33

+1

[删除本地分支机构不再在远程](http://stackoverflow.com/questions/7726949/remove-local-branches-no-longer-on-remote) – ks1322 2016-06-07 15:37:35

回答

19

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

通常这些地方分支机构应删除一旦合并为master(如this issue of git-sweep所示):

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

这是不是只要你想完成,但它是一个开始。

对于--merged,只会列出合并到指定提交中的分支(即其提示提交可从指定提交中获得的分支)。

+0

也包括没有本地分支的远程分支,使用'git branch -a - -merged'。 – 2017-05-11 18:24:20

13

后期编辑:更好的是

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 

如果超过了一把树枝很可能有会是更好的方式,使用comm -23git branch|sed|sortgit config -l|sed|sort的输出上。

+0

这看起来比我的答案更准确。 +1 – VonC 2013-03-28 04:43:36

+0

任何人都知道BSD sed命令等价物可能是什么? – nmr 2014-04-16 21:10:01

+1

@nmr s/git。* Q1/test $(git config --get branch。$ b.remote | sed q | wc -1)= 1/ – jthill 2014-04-17 03:04:04

2

粗糙的PowerShell执行:(如果产地是你唯一的远程)

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

与其仅仅倾销大量代码,解释如何部分工作(所以其他人可以适应,如果他们有相似的,但不是确切的需求)。 – MrFlick 2014-05-19 22:49:13

+0

或至少格式化,以便人们可以看到这一切。我只是这样做,但我不知道PowerShell的续行。也就是说,窗户上的“sed”不能做,...... ,,'?它真的需要所有这一切?和:在哪里测试一个空的'$ X'? – jthill 2014-05-19 23:14:41

42

我最近发现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 

一旦你有了这个很好的格式化输出,它是一样简单管道是通过cutawk让你列表:

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

结果如下输出:

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

cut部分只是在将数据传递到awk之前,从输出中移除前两个字符(包括*)以对数据进行规范化。

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

奖励:创建一个别名

使容易通过在全球.gitconfig文件(或地方)创建一个别名运行:

[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 }' 
+0

这件事情还列出了发展和主分支.. egh .. – igrek 2017-10-26 11:56:48

+0

什么是'WIP:'无论如何..?这不是一个隐藏命令创建..? – igrek 2017-10-26 11:58:25

+0

@igrek这只是我在提交消息中使用的前缀。没有特定的混帐。 – 2017-10-27 04:04:03

10

我有类似的问题。我想删除正在跟踪现在被删除的远程分支的所有本地分支。我发现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 config --global ...命令轻松地添加这是git prune-branches

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

:我在我的实际配置中将-d更改为-D,因为我不想听到Git抱怨未装入分支。您可能需要也需要此功能。如果是这样,则只需在该命令的末尾使用-D而不是-d即可。

此外,FWIW,您的全局配置文件几乎总是~/.gitconfig

+1

是否有可能将其转换为“git config --global ...”命令?从一个指令/如何到wiki-for-dummies的角度来看,它很容易传递,而不是说“找出你的git配置文件,使用编辑器编辑它然后运行命令” – 2017-09-19 09:04:10

5

这个工作对我来说:

git branch -vv | grep -v origin

(如果你的遥控器被命名为任何东西比其他产地,替代品)。

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

+0

这将列出用于有一个遥控器,但即使你运行'git fetch --prune'也不行。 – RusinaRange 2017-10-23 11:16:27

相关问题