[解決済み] [Solved] 未コミットの変更があるかどうかをプログラムで判断するには?
質問
Makefile で、コミットされていない変更があった場合 (作業ツリーまたはインデックスのいずれか) に特定のアクションを実行したいのですが、どうすればいいですか? これを行うのに最もクリーンで効率的な方法は何でしょうか? 一方の場合はゼロ、他方の場合は非ゼロの戻り値で終了するコマンドは私の目的に合っています。
を実行することができます。
git status
を経由して出力をパイプします。
grep
しかし、もっといい方法があるような気がします。
どのように解決するのですか?
アップデイト
: OP
ダニエル・シュトゥッツバッハ
指摘
コメントで
この単純なコマンドは
git diff-index
が効いたそうです。
git update-index --refresh
git diff-index --quiet HEAD --
より正確なオプションは
git status --porcelain=v1 2>/dev/null | wc -l
を使用します。
porcelain
オプション
.
参照
ミリディウム
's
回答
.
(
九角形
言及
コメントで
を実行する必要があります。
git update-index --refresh
前に
git diff-index
それ以外の場合は
diff-index
は、ツリーが汚れていると誤って報告します)
すると、"が表示されます。 コマンドが成功したかどうかを確認するには? bashスクリプトで使用している場合は、"です。
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
注 コメント によって アンソニー・ソッティル
git diff-index HEAD ...
は、コミットのないブランチ (たとえば新しく初期化されたリポジトリ) では失敗します。
私が見つけた一つの回避策はgit diff-index $(git write-tree) ...
そして
haridsv
ポイント
コメントで
その
git diff-files
を搭載しています。
新しい
ファイルでは、差分として検出されません。
より安全な方法としては
git add
を使用し、その後
git diff-index
を実行する前に、インデックスに何かが追加されたかどうかを確認するために
git commit
.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
そして 6502 をコメントで報告しています。
ぶつけた問題点としては
git diff-index
は、ファイルのタイムスタンプを除いて、実際には何の違いもないのに、違いがあると言ってしまいます。
実行中git diff
を一回で解決してしまう(意外と知られていない。git diff
は実際にサンドボックスの内容を変更します。つまり、ここでは.git/index
)
このようなタイムスタンプの問題は、git が次のような場合にも発生します。 dockerで動作している .
オリジナルの回答です。
プログラム的にというのは
には決して頼らないでください。
ポーセリンコマンド
.
いつも頼りにしている
配管コマンド
.
"もご覧ください。
Git でダーティなインデックスや未追跡のファイルをチェックする
のような)代替案については、" を参照してください。
git status --porcelain
)
インスピレーションを得ることができます
を追加しました。
require_clean_work_tree
機能
現在執筆中です。
;) (2010年10月初旬)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}
関連
-
[解決済み] Git作者不明
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git にファイルモード (chmod) の変更を無視させるには?
-
[解決済み] ステージングされた変更を表示するにはどうしたらいいですか?
-
[解決済み] Git で管理されているプロジェクトのローカルな変更をすべて以前の状態に戻すにはどうすればよいですか?
-
[解決済み] Gitで落としたスタッシュを復元する方法とは?
-
[解決済み] Gitでファイルの変更を追跡しない、無視する方法とは?
-
[解決済み] 単一ファイルのハードリセット
-
[解決済み] ファイルやフォルダを含むコミットされていない変更を元に戻すにはどうすればよいですか?
最新
-
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:コミットに何も追加されていないが、未追跡のファイルが存在する
-
[解決済み】以下の追跡されていないワーキングツリーファイルは、マージによって上書きされますが、私は気にしません。
-
[解決済み】「オリジン/マスターへのプッシュが拒否されました」というエラーが常に発生するのはなぜですか?
-
[解決済み】Githubエンタープライズ - リモート。Git の操作でパスワード認証が利用できない
-
[解決済み] リモートから<branch name>とマージするように構成が指定されていますが、そのような参照は取得されませんでしたか?
-
[解決済み] 複数のコミットをチェリーピックする方法
-
[解決済み] gitブランチをオリジンバージョンにリセットする必要がある
-
[解決済み] ポーセリンとは、Gitではどのような意味ですか?
-
[解決済み】Gitでダーティなインデックスや未追跡のファイルをチェックする
-
[解決済み] あるコミットが他のコミットの子孫であるかどうかを判断するにはどうすればよいですか?