有什么方法可以获取git branch -v管道命令的输出吗?确切地说,我只对分支的状态感兴趣,即是否感兴趣[gone]。
例如,给出以下git branch -v输出:
> git branch -v
master 32c59ad4 Some other comment
someDeletedBranch 6aacba47 [gone] Some Comment
Run Code Online (Sandbox Code Playgroud)
我如何获得someDeletedBranch裁判?
请注意,这与并不相同git branch --merged,例如,如果您要将拉取请求压缩到主服务器中,那么该解决方案将无法实现。
这主要与该问题有关,因为这将是缺少能够创建可靠脚本以删除远程不再存在的本地分支的部分。
git branch通常用管道代替git for-each-ref。
$ git fetch --prune
$ git for-each-ref --format '%(refname) %(upstream)' refs/heads refs/remotes/origin
Run Code Online (Sandbox Code Playgroud)
此输出将包括每个本地分支的条目,以及每个指向起点的远程跟踪引用的条目;因此,如果如此处fetch --prune所示在此之后立即运行,它可以向您显示本地存在但服务器上不存在的内容。
当然有一个陷阱:“本地存在,但不在服务器上” 可能意味着“已从服务器中删除”,或者可能意味着“在本地创建但尚未推送”。要说出区别,您还需要知道您的本地分支是否“认为”它具有上游。(如果这样做,则可以假定它已从服务器中删除是相当安全的,因为它git拒绝设置不存在的上游;因此,要弄错它,基本上必须有人故意用损坏的配置来“欺骗”您的脚本。)
这就是--format选择的目的。您可以处理此输出,寻找
refs/heads/somebranch refs/remotes/origin/somebranch
Run Code Online (Sandbox Code Playgroud)
并且,每个这样的条目,如果不是也像一个单独的条目
refs/remotes/origin/somebranch
Run Code Online (Sandbox Code Playgroud)
那么这是一个会被标记的分支 [gone]
基于马克的答案和这篇文章,这是一个非常干净的解决方案(为了可读性而分割线):
git for-each-ref \
--format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' \
refs/heads
Run Code Online (Sandbox Code Playgroud)
--format使用此功能的一个简单方法是将命令替换为git branch -D. 请注意,如果没有要删除的分支,git 会抱怨。
git branch -D $(git for-each-ref --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' refs/heads)
Run Code Online (Sandbox Code Playgroud)
这是一个稍长的版本,如果没有要删除的分支,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
Run Code Online (Sandbox Code Playgroud)
或者,您可以将 的输出保存git for-each-ref到变量中,然后有条件地删除分支(如果不为空),或者显示一条消息(如果为空)。