git status" をターミナルに強制的にカラー出力させる (スクリプトの中で)
質問
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}"
その他の例 ここで .
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git で現在のブランチ名を取得するには?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】Gitバージョン管理でファイルの変更履歴を見る
-
[解決済み] GitとSSH、どちらのキーを使うか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[git push] 解決策: ! [リモート拒否] master -> master (受信前のフックは拒否されました)
-
git commit to GitHub エラー、プロンプト ! [リモート拒否] master -> master (pre-receive hook declined) エラー: 失敗しました。
-
解決策 このリポジトリでは、別の git プロセスが実行されているようです。たとえば、「git commit」によって開かれたエディタなどです。
-
git push は最新の解決策を提供します。
-
コミットには何も追加されないが、未追跡のファイルが存在する解決策
-
[Gitラーニングノート】Gitのコンフリクト:マージする前に変更をコミットするかstashする。
-
なぜこのマージが必要なのかを説明するコミットメッセージを git に入力してください。
-
git push please tell me who you are or git fatal: empty ident name (for <>) not llowed.
-
git-fatal: 設定されたプッシュターゲットがありません / 警告: store/README.md の LF は CRLF に置き換えられています。
-
[解決済み] gitでコミット間を前進・後退させる方法は?