How can I color Git branches based on their names?

杀马特。学长 韩版系。学妹 提交于 2019-11-30 13:50:46

git-branch doesn't let you do that

Is there a way to color branch names in the output of git branch according to some regexp-based rules without using external scripts?

No; Git doesn't offer you a way of customising the colors in the output of git branch based on patterns that the branch names match.

Write a custom script

The best I've come up with so far is to run git branch through an external script, and create an alias.

One approach is indeed to write a custom script. However, note that git branch is a porcelain Git command, and, as such, it shouldn't be used in scripts. Prefer the plumbing Git command git-for-each-ref for that.

Here is an example of such a script; customize it to suit your needs.

#!/bin/sh

# git-colorbranch.sh

if [ $# -ne 0 ]; then
    printf "usage: git colorbranch\n\n"
    exit 1
fi

# color definitions
color_master="\033[32m"
color_feature="\033[31m"
# ...
color_reset="\033[m"

# pattern definitions
pattern_feature="^feature-"
# ...

git for-each-ref --format='%(refname:short)' refs/heads | \
    while read ref; do

        # if $ref the current branch, mark it with an asterisk
        if [ "$ref" = "$(git symbolic-ref --short HEAD)" ]; then
            printf "* "
        else
            printf "  "
        fi

        # master branch
        if [ "$ref" = "master" ]; then
            printf "$color_master$ref$color_reset\n"
        # feature branches
        elif printf "$ref" | grep --quiet "$pattern_feature"; then
            printf "$color_feature$ref$color_reset\n"
        # ... other cases ...
        else
            printf "$ref\n"
        fi

    done

Make an alias out of it

Put the script on your path and run

git config --global alias.colorbranch '!sh git-colorbranch.sh'

Test

Here is what I get in a toy repo (in GNU bash):

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!