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

时间:2018-07-31 14:46:52

标签: git colors git-config

我的问题不是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似乎无法为匹配的正则表达式的子集着色,因此无法为上游状态中的着色着色,并且不幸命名的分支将获得“随机”着色。

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/

但这并不完美:

  • 无法重置颜色,因此以下项目的颜色不正确
  • 无法将对齐宽度指定为“最长的项目”,这就是为什么我的示例使用%(align:left,53); 53对我当前的分支集恰好是正确的。

我已将此添加到我的gitconfig中以用作备用。

更新2

我解决了颜色重置问题。我确定我曾经尝试过%(color:reset),但是在阅读了git log帮助后,看到它具有颜色重置机制,我再次尝试了一下,它就起作用了。

更新3

使用this answer中的两次通过方法,我到达了:

        br = "!f() {  \
               if [ -z \"$1\" ] || [ \"$1\" = \"-v\" ] || [ \"$1\" = \"-vv\" ]; then  \
                   width=$(git for-each-ref --format='%(refname:short)' refs/heads | wc -L);  \
                   if [ \"$1\" = \"-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,并保留其余的通过传递功能。在参数处理方面仍有改进的余地,但这已经足够了。

1 个答案:

答案 0 :(得分:2)

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/

我将其分解成几行用于StackOverflow发布。单行版本可能更适合作为起点,尤其是在您不使用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所显示的内容。