Git 颜色:如何在“git branch -vv”中为上游分支_status_设置颜色?

Git colors: How do I set colors for the upstream branch _status_ in “git branch -vv”?

我的问题不是 this question 的重复问题;我想知道如何为分支状态的 gone 部分着色:

user@host:~/devel/repo$ git branch -vv
user/feature           3ffcd496f [github/user/feature: gone] Feature complete

我在当前的 git version 2.17.1 手册页中找不到任何对此功能的引用,所以我猜它还不存在。谷歌搜索也没有找到任何相关内容。

我发现当有很多分支时,状态有时会在文本墙中丢失。我希望它更突出一点。

我可以使用 this question 中的一个答案,但考虑到我想要着色的信息对上下文的敏感程度,这些答案中的大多数很快就会变得非常毛茸茸。例如,colorit 似乎无法为匹配的正则表达式的子集着色,因此不可能仅对上游状态中的 gone 着色,并且命名不当的分支将得到 "randomly" 着色。

git 是上下文的来源,因此是进行着色的自然选择。

更新

根据@torek 的回答,我已经接近复制 git branch -vv 输出:

git for-each-ref --format='%(HEAD) %(if)%(HEAD)%(then)%(color:green)%(end)%(align:left,53)%(refname:short)%(end)%(color:reset)%(objectname:short) %(if)%(upstream)%(then)[%(color:blue)%(upstream:short)%(color:reset)%(if)%(upstream:track,nobracket)%(then): %(color:red)%(upstream:track,nobracket)%(color:reset)%(end)] %(end)%(subject)' refs/heads/

不过还不完美:

我已将此添加到我的 git 配置中以用作备用。

更新 2

我修复了颜色重置问题。我确信我已经尝试过 %(color:reset),但在阅读了 git log 帮助并看到它具有颜色重置机制后,我再次尝试并成功了。

更新 3

使用 this answer 中的两次传递方法,我得到了:

        br = "!f() {  \
               if [ -z \"\" ] || [ \"\" = \"-v\" ] || [ \"\" = \"-vv\" ]; then  \
                   width=$(git for-each-ref --format='%(refname:short)' refs/heads | wc -L);  \
                   if [ \"\" = \"-v\" ]; then  \
                       git for-each-ref --format=\"%(HEAD) %(if)%(HEAD)%(then)%(color:green)%(end)%(align:left,$width)%(refname:short)%(end)%(color:reset) %(objectname:short) %(if)%(upstream:track,nobracket)%(then)[%(color:red)%(upstream:track,nobracket)%(color:reset)]%(end) %(subject)\" refs/heads/;  \
                   else  \
                       git for-each-ref --format=\"%(HEAD) %(if)%(HEAD)%(then)%(color:green)%(end)%(align:left,$width)%(refname:short)%(end)%(color:reset) %(objectname:short) %(if)%(upstream)%(then)[%(color:blue)%(upstream:short)%(color:reset)%(if)%(upstream:track,nobracket)%(then): %(color:red)%(upstream:track,nobracket)%(color:reset)%(end)] %(end)%(subject)\" refs/heads/;  \
                   fi;  \
               else  \
                   git branch \"$@\";  \
               fi;  \
               }; f"

这会计算所需的对齐宽度,在 -v-vv 情况下为跟踪信息着色,使默认的无参数形式改为 -vv,并保留其余部分通过传递分支功能。参数处理还有改进的余地,但目前已经足够了。

git branch这里没有办法改变gone字的颜色

如果您的 Git 足够新—检查您安装的文档以了解 git for-each-ref 是否支持这些字段和 %(if) 测试—然后 git for-each-ref 是否有办法设置 %(upstream:track) 输出的颜色。您可以使用它来构建您 git branch -vv 获得的相同输出,只是它具有您想要的颜色支持。

这是一个简单的例子:

git for-each-ref \
    --format='%(refname:short) '\
'%(if:equals=gone)%(upstream:track,nobracket)%(then)'\
'%(color:red)%(end)%(upstream:track)%(color:black)' \
    refs/heads/

为了 Whosebug 发布目的,我将其分成几行。单行版本可能更适合作为起点,特别是如果您不使用 sh/bash:

git for-each-ref --format='%(refname:short) %(if:equals=gone)%(upstream:track,nobracket)%(then)%(color:red)%(end)%(upstream:track)%(color:black)' refs/heads/

请注意,您需要扩充 % 指令集以显示 git branch -v 显示的所有内容。