【问题标题】:Git colors: How do I set colors for the upstream branch _status_ in “git branch -vv”?Git颜色:如何在“git branch -vv”中为上游分支_status_设置颜色?
【发布时间】:2019-01-08 00:22:47
【问题描述】:

我的问题不是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,并通过传递它来保留其余的分支功能.参数处理还有改进的余地,但现在已经足够了。

【问题讨论】:

    标签: git colors git-config


    【解决方案1】:

    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 显示的所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-15
      • 2014-04-09
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2014-02-27
      • 2017-10-04
      • 1970-01-01
      相关资源
      最近更新 更多