1. ホーム
  2. ギット

[解決済み】Git diffでサブプロジェクトがダーティだと言われる

2022-04-03 11:26:04

質問

git diff を実行したところ、約10個のサブモジュールすべてについて以下のような出力が得られました。

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

これはどういうことでしょうか?どうすれば直るのですか?

解決方法は?

10年後の2021年1月更新。

" git diff " ( 男性 ) サブモジュールの作業ツリーに、未追跡の残骸があることをサブモジュールのコミットとして表示しました。 <objectname>-dirty が、当然予想されるのは、" -dirty というインジケータが表示されます。 git describe --dirty " ( 男性 ) これは、作業ツリーに追跡されていないファイルがあることを汚れの原因とは見なさないものです。

この不整合は、Git 2.31 (2021 年第 1 四半期) で修正されました。

参照 コミット 8ef9312 (2020年11月10日)によるものです。 サンゲータ・ジェイン( sangu09 ) .

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット0806279 , 2021年1月25日)

<ブロッククオート

diff : 未追跡のファイルを含むサブモジュールを " として表示しないようにしました。 -dirty "

サインオフバイ:サンゲータ・ジェイン

<ブロッククオート

Git の diff では、サブモジュールのディレクトリが -dirty サブモジュールディレクトリに未追跡のファイルしかない場合でも

というのは矛盾しています。 git describe --dirty ( 男性 ) は、その状態でサブモジュールディレクトリで実行すると、こうなります。

作る --ignore-submodules=untracked のデフォルトは git diff ( 男性 ) 設定変数やコマンドラインオプションがない場合、コマンドは ' -dirty と整合性を持たせるために、作業ツリーに未追跡ファイルがあるサブモジュールのサフィックスを git describe --dirty がサブモジュールの作業ツリーで実行されていることを示します。

そしてまた --ignore-submodules=none のデフォルトは git status ( 男性 ) で、コミットされていない (追跡されていない) ファイルを持つサブモジュールをユーザーが削除してしまわないようにするためです。

git config に含まれるようになりました。 マンページ :

デフォルトでは、これは untracked に設定されており、未追跡の サブモジュールは無視されます。


オリジナルの回答(2011年)

マーク・ロングエアのブログ記事で紹介されているように Git サブモジュールの説明 ,

バージョン1.7.0以降のgitには うざい変更 は、git submodule の動作に影響を与えます。

サブモジュールは、変更されたファイルや追跡されていないファイルがある場合、ダーティとみなされるようになりました。 以前はサブモジュールの HEAD が間違ったコミットを指している場合のみでしたが。

<ブロッククオート

プラス記号の意味( + ) の出力が変更されました。初めてこれに遭遇したときは、何が問題なのかを理解するのに少し時間がかかります。たとえば、変更履歴を調べたり git.git の git bisect を使って変更箇所を探したりするのです。 指定されたバージョンではあるが、ダーティである」ことを示す別のシンボルを導入した方が、ユーザーにとってずっと親切だったのではないでしょうか。

で直せます。

  • 親リポジトリに戻る前に、各サブモジュール内の変更/進化をコミットするか元に戻すか、どちらかを行ってください (ここで diff はもう "dirty" ファイルを報告しないはずです)。 サブモジュールの変更をすべて取り消すには、単に cd をサブモジュールのルートディレクトリに移動し、次のようにします。 git checkout .

ドットネットカーペンター コメント ができること。 git submodule foreach --recursive git checkout .

  • または --ignore-submodulesgit diff を一時的に無視するために、これらの "dirty" サブモジュールを使用します。

Git バージョン 1.7.2 の新機能

として ノーム 以下コメント , この質問 は、git バージョン 1.7.2 以降、ダーティなサブモジュールを無視できるようになったことを述べています。

git status --ignore-submodules=dirty