有没有办法将git branch -v
的输出作为管道命令?确切地说,我只对分支的状态感兴趣,即它是否是[gone]
。
例如,给定以下git branch -v
输出:
> git branch -v
master 32c59ad4 Some other comment
someDeletedBranch 6aacba47 [gone] Some Comment
如何获得someDeletedBranch
参考?
请注意,这是而不是与git branch --merged
相同,例如,如果您正在将pull请求压缩到您的master中,则此解决方案不会起作用。
这主要与这个问题有关,因为这将是能够创建可靠脚本来删除远程上不再存在的本地分支所缺少的部分。
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]
的分支
Git v2.13.2+
在Mark的回答和这篇文章的基础上,这里有一个非常干净的解决方案(为了可读性,拆分行(:
git for-each-ref
--format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'
refs/heads
优点:
- 仅使用管道命令,请参阅
"gone" as plumbing message
upstream:track
显示[gone]
- 没有外部依赖项
- 解析和比较逻辑由
--format
处理 - 应该在所有支持git的平台上工作
- 解析和比较逻辑由
- 短而干净的一个衬垫
删除不在远程上的本地分支的简单方法
一种简单的使用方法是用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
的输出保存到一个变量中,然后有条件地删除分支(如果它不是空的(,或者显示一条消息(如果它是空的(。