通过管道命令的Git分支状态

时间:2018-11-27 16:02:40

标签: git

是否可以通过管道命令获取Test5的输出?确切地说,我只对分支的状态感兴趣,即是否为git branch -v

例如,给出以下[gone]输出:

git branch -v

我如何获得> git branch -v master 32c59ad4 Some other comment someDeletedBranch 6aacba47 [gone] Some Comment 裁判?

请注意,这与someDeletedBranch 不同,例如,如果您要将拉取请求压缩到主服务器中,则this solution不会这样做。

这主要与this question有关,因为这将是缺少能够创建可靠脚本来删除远程不再存在的本地分支的部分。

2 个答案:

答案 0 :(得分:5)

git branch的管道替代通常是git for-each-ref

$ git fetch --prune
$ git for-each-ref --format '%(refname) %(upstream)' refs/heads refs/remotes/origin

此输出将包括每个本地分支的条目,以及每个指向起点的远程跟踪引用的条目;因此,如此处所示,如果紧接fetch --prune之后运行,它可以向您显示本地存在但服务器上不存在的内容。

当然有一个陷阱:“本地存在,但不在服务器上”。可能的意思是“已从服务器中删除”,或者可能意味着“在本地创建但尚未推送”。要说出区别,您还需要知道您的本地分支是否“认为”它具有上游。 (如果确实如此,则假定它已从服务器中删除是相当安全的,因为git拒绝设置不存在的上游;因此,要弄错了,基本上必须有人故意用“欺骗”您的脚本。配置损坏。)

这就是--format选项的作用。您可以处理此输出,寻找

refs/heads/somebranch refs/remotes/origin/somebranch

,对于每个这样的条目,如果没有 ,也没有单独的条目,例如

refs/remotes/origin/somebranch

然后这是一个分支,将标记为[gone]

答案 1 :(得分:3)

仅Git v2.13.2 +

以Mark的答案和this post为基础,这是一个非常干净的解决方案(为了便于阅读,使用了分割线):

git for-each-ref \
    --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' \
    refs/heads

好处:

删除不在远程站点上的本地分支的简单方法

一种简单的使用方法是用git branch -D替换命令。请注意,如果没有要删除的分支, git将会抱怨

git branch -D $(git for-each-ref --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' refs/heads)

这里是一个稍长的版本,如果没有要删除的分支,git不会抱怨。

for branch in $(git for-each-ref --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' refs/heads); do git branch -D $branch; done

或者,您可以将git for-each-ref的输出保存到变量中,然后有条件地删除分支(如果不为空),或者显示一条消息。