1. ホーム
  2. git

git status" をターミナルに強制的にカラー出力させる (スクリプトの中で)

2023-08-20 22:20:35

質問

EDITです。

色の解析は一般的に考え方が悪いということを提言しておきたい。

私がそれを必要とした理由の一部は、私がそれを解析し、私自身のスクリプト出力でそれを渡すことができるようにすることでした。これは...大丈夫ですが、おそらく磁器などを使用して、色のついた部分を自分で再構築する方が健全でしょう!

元の質問は次のとおりです。


私のスクリプトはカラー コードを処理するのに十分堅牢であるため、私はカラーを見るのが好きです (これまでのところ)。私がこの流れに逆らっているように見えますが、正直なところ、スクリプトでエスケープ コードのようなものを解析しなければならないことについて、何が大きな問題なのか理解できません。もし色がインタラクティブな使用に役立つなら、データを集約して手動よりもさらに多くのデータを処理するようなスクリプトの使用にも役立つのではないでしょうか? 色は はさらに重要で ?

とにかく、私が書いた小さなシェルスクリプトで git status を出力するシェルスクリプトがあるのですが、このスクリプトで色をそのまま維持できるようにしたいと思っています。私のグローバルな git 設定は、git ステータスに変更されたファイルや追跡されていないファイルのリストが色付きで表示されるように設定されています。しかし、残念ながら git diff とは異なり、 の色を強制するオプションはありません。 git status に色を強制するオプションはありません。

はっきり言って、これが問題なのです。

$ git status

は完璧な出力を生成しますが、(以下、私のスクリプトからの抜粋)

git status | sed "s/^#/\x1b[34m#[0m/"

は色つきの git status の出力には色が付きません。ここでは、スクリプトの出力の異なる領域を強調するために、先頭のハッシュ文字を明示的に青に変換していることまでわかります。

色を出力させる方法を知っている人はいますか? 偽の端末の STDIN/STDOUT パイプとして使用できる標準的なプログラムはないでしょうか。実際、私は pty 擬似ターミナル ツールにも取り組んでいるので、確かにこの目的のためにそれを利用することができますが、それはかなり強引な解決法です (そして、私はそれを構築し終えていないので、まだ使用する準備ができていません)。

どのように解決するのですか?

git の設定を変更しないようにするには、現在のコマンドに対してのみ色を有効にします。 -c .

については status コマンドの場合、変数は color.status :

    git -c color.status=always status | less -REX

について diff , show , log そして grep コマンドを使用すると、変数が color.ui :

    git -c color.ui=always diff | less -REX

なお -c は必ず の前に その status または diff の引数の後ではありません。

あるいは diff , show , log そして grep コマンドを使用すると --color=always の後に の後、コマンドを実行します。

    git diff --color=always | less -REX


注意: Steven が言ったように、意味のあるデータを抽出しようとしているのであれば、色を解析して意味を抽出する代わりに --porcelain を使用すると、よりパーサーに適した出力が得られます。

    git status --porcelain | awk ...

そうすれば、もし望むなら、後で色を再導入することができます。

ユーザーが設定した色を取得するために git config --get-colour :

    reset_color="$(tput sgr0)"
    remote_branch_color="$(git config --get-color color.branch.remote white)"

    echo "Pushing to ${remote_branch_color}${branch_name}${reset_color}"

その他の例 ここで .