根据 git diff --name-status 的状态对文件名进行着色

根据 git diff --name-status 的状态对文件名进行着色

我经常用来git diff --name-status BRANCH_NAME获取已修改文件的列表。是否可以对该命令的输出进行着色,类似于git status- 绿色表示添加的文件,蓝色表示修改,红色表示删除等。

它不是重复的如何对 git 的输出进行着色?因为我想对输出的不同部分进行着色,并且建议的配置文件中的更改不适用

答案1

我不知道有任何官方方法可以做到这一点,但我刚刚写了这篇文章,它对我有用。
将下面的 bash 脚本放入一个名为:(color_git_diff.sh 或任何你想要的)的文件中

#!/usr/bin/env bash

for i in "$@"
do
    if  grep -q "^M" <<< "$i"
    then
        echo -e "\e[33m $i \e[0m"
    elif  grep -q "^D" <<< "$i"
    then
        echo -e "\e[31m $i \e[0m"
    fi
done

要应用脚本,您可以使用以下方式调用它:

git diff --name-status | xargs --delimiter="\n" ./color_git_diff.sh

显然你不想每次都调用它,所以你需要将它放入你的bashrc并为其分配一个函数或别名 - 或类似的东西。
这只会为修改或删除的文件生成彩色输出,并且我将修改后的文件设置为黄色 - 我不知道我头顶上的蓝色的 ansi 转义码是什么 - 我想也许吧\e[36m?无论如何,如果你想使用它,你可以自己添加 -

答案2

我想提供一种稍微更新的方法来执行此操作,原因很简单,当我尝试主要答案时,它速度慢得令人难以忍受,输出行之间几乎有一秒钟。这可能是由于在 Windows 上运行 git 而不是在 *nix 机器上运行,但“grep”命令需要很长时间才能有效。话虽如此,给定两者的“--name-status”参数的输出,可以实现相同的效果git 日志git 差异是简单的字符串,因此使用简单的字符串匹配而不是“grep”工具,我的输出几乎是立即的。

for i in "$@"
do
    if  [[ ${i:0:1} == "M" ]] #grep -q "^M" <<< "$i"
    then echo -e "\e[34m $i \e[0m"
    elif [[ ${i:0:1} == "D" ]] #grep -q "^D" <<< "$i"
    then echo -e "\e[31m $i \e[0m"
    elif [[ ${i:0:1} == "A" ]] #grep -q "^A" <<< "$i"
    then echo -e "\e[32m $i \e[0m"
    else echo -e "$i"
    fi
done

我还添加了“添加”的代码以及默认值,因此如果有其他文本(如 git log --pretty),它将不会被忽略。

Jaeden "Sifo Dyas" al'Raec Ruiner
PS - 使用相同的 xargs 命令和分隔符,但上面的脚本解析速度比 grep 更快(在 Windows 盒子上)

答案3

这是做同样事情的另一种方法。它使用一个“sed”命令处理所有行。

color_git_diff.sh:

#!/bin/bash

sed $'
s/^M/\033[33mM/
s/^A/\033[32mA/
s/^D/\033[31mD/
s/$/\033[0m/'

您可以像这样使用它:

git diff --name-status | ./color_git_diff.sh

答案4

尝试下一个命令:

vimdiff [file1] [file2]

相关内容