从 git 钩子执行时的 C# 应用彩色输出

C# app colored output when executed from git hooks

当从 git 钩子 执行时,我需要在控制台应用程序中显示彩色输出(预提交等)。这是我的一个开源项目的问题,您可以查看 here

假设我们有一个控制台应用程序,代码如下:

Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Hello World");

当我们从 git 钩子中 运行 时,输出是 white

我也尝试使用 VT100 转义码和 enabling console virtual terminal 序列,但结果相同。

// ENABLE_VIRTUAL_TERMINAL_PROCESSING ...

// set color vt100
public static void SetForegroundColor(int r, int g, int b)
{
   Console.Write($"\x1b[38;2;{r};{g};{b}m");
}

例如预提交

#!/bin/sh

# run the application.
husky run 

如果有任何信息可以帮助我找出造成这种情况的原因,我们将不胜感激。问题是我还不确定去哪里找,是 git 的具体问题吗? Shell 脚本问题还是 C# 问题?

看起来 git bash 不支持 extended colors:

使用 vt100 转义颜色控件,无需扩展颜色即可解决问题。

Console.WriteLine("\x1b[31mHello World2!\x1b[0m");
   /// <summary>
   /// https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#text-formatting
   /// Git-bash only supports 8 colors provided by the Windows Console.
   /// </summary>
   /// <param name="color"></param>
   /// <exception cref="ArgumentOutOfRangeException"></exception>
   public static void SetForegroundColor(ConsoleColor color)
   {
      var colorCode = color switch
      {
         ConsoleColor.Black => 30,
         ConsoleColor.Red or ConsoleColor.DarkRed => 31,
         ConsoleColor.Green or ConsoleColor.DarkGreen => 32,
         ConsoleColor.Yellow or ConsoleColor.DarkYellow => 33,
         ConsoleColor.Blue or ConsoleColor.DarkBlue => 34,
         ConsoleColor.Magenta or ConsoleColor.DarkMagenta => 35,
         ConsoleColor.Cyan or ConsoleColor.DarkCyan => 36,
         ConsoleColor.White => 37,
         _ => throw new ArgumentOutOfRangeException(nameof(color), color, null)
      };
      Console.Write($"\x1b[{colorCode}m");
   }