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/
不过还不完美:
无法重置颜色,因此以下项目的颜色不正确
无法指定 "longest item" 的对齐宽度,这就是为什么我的示例具有 %(align:left,53)
; 53 恰好适合我当前的一组分支。
我已将此添加到我的 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
显示的所有内容。
我的问题不是 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/
不过还不完美:
无法重置颜色,因此以下项目的颜色不正确无法指定 "longest item" 的对齐宽度,这就是为什么我的示例具有%(align:left,53)
; 53 恰好适合我当前的一组分支。
我已将此添加到我的 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
显示的所有内容。